序列化
-
序列化: 将数据结构或对象转换成二进制串的过程
-
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
序列化是用来通信的,服务端把数据序列化,发送到客户端,客户端把接收到的数据反序列化后对数据进行操作,完成后再序列化发送到服务端,服务端再反序列化数据后对数据进行操作。说白了,数据需要序列化以后才能在服务端和客户端之间传输。这个服务端和客户端的概念是广义的,可以在网络上,也可以在同一台机器的不同进程中,甚至在同一个进程中进行通信。在传统编程中,对象是通过调用栈间接的与客户端交互,但在面向服务的编程中,客户端永远都不会直接调用实例。
序列化将各种不同类型的数据紧凑地存储进一个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空间不足,或数据类型错误时,都将失败。