博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
序列化
阅读量:6249 次
发布时间:2019-06-22

本文共 1146 字,大约阅读时间需要 3 分钟。

序列化

  • 序列化: 将数据结构或对象转换成二进制串的过程

  • 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

序列化是用来通信的,服务端把数据序列化,发送到客户端,客户端把接收到的数据反序列化后对数据进行操作,完成后再序列化发送到服务端,服务端再反序列化数据后对数据进行操作。说白了,数据需要序列化以后才能在服务端和客户端之间传输。这个服务端和客户端的概念是广义的,可以在网络上,也可以在同一台机器的不同进程中,甚至在同一个进程中进行通信。在传统编程中,对象是通过调用栈间接的与客户端交互,但在面向服务的编程中,客户端永远都不会直接调用实例。

序列化将各种不同类型的数据紧凑地存储进一个buffer中,这种数据非常适用于网络传输。服务端的RMI模块就采用了序列化格式传输数据。

1、序列化是干什么的?

       简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,

2、什么情况下需要序列化   
    a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;


序列化类型简介

项目中的序列化工具存放在tlvprotocol.h文件中,TLVSerializer提供序列化数据到buffer中的功能,TLVUnserializer提供从buffer中反序列化数据的功能。

序列化和反序列化的顺序要保持一致。

举一个例子,现在有这样一个数据结构:

struct Foo{    int a = 0;    double b = 0;};Foo foo;

将这块数据序列化的方法是:

char buffer[1024];  // 确保空间足够TLVSerializer s;s.Reset(buffer, sizeof(buffer));s.Push(foo.a);s.Push(foo.b);

反序列化的方法则是:

 

Foo foo2;TLVUnserializer us;us.Reset(buffer, s.Size());us.Pop(&foo2.a);us.Pop(&foo2.b);

Push和Pop方法都有可能失败,实际编程中我们一定要对失败的情况做严格的检查。通常序列化失败是一种严重的错误。

 

理解序列化的本质

不管序列化的目的是什么,其本质就是把复杂的数据类型变成单纯的二进制数据。其方式是操作一块buffer,并向它存取数据。

在存取过程中,当遇到buffer空间不足,或数据类型错误时,都将失败。

 

转载于:https://www.cnblogs.com/jonwei/p/9594080.html

你可能感兴趣的文章
JS基础--问题记录
查看>>
(七)磁盘调度
查看>>
Kubernetes部分Volume类型介绍及yaml示例--NFS(网络数据卷)
查看>>
JMS(十):使用ActiveMQ之JMSReplyTo
查看>>
从无到有快速搭建一个基于Web的Mail服务器,能够实现邮件的收发
查看>>
POJ 3420 Quad Tiling 题解 《挑战程序设计竞赛》
查看>>
查询语句的逻辑处理顺序
查看>>
Hibernate延迟加载
查看>>
浅析Happyhour的适用性
查看>>
《Delphi 算法与数据结构》简介及下载
查看>>
学习 SQL 语句 - Select(1): 指定表
查看>>
再说变体结构 - 回复 "彬" 的问题
查看>>
文件操作命令一rm 4
查看>>
【JS】将NodeList转换为数组
查看>>
使用Powershell改变Azure经典虚拟机Size
查看>>
SVN 问题 - org.apache.subversion ....
查看>>
Centos6.9基于FPM模式编译安装实现LAMP应用wordpress
查看>>
我的友情链接
查看>>
标志位的作用
查看>>
微软MCITP系列课程(十六)系統啟動疑難排除
查看>>