一、序列化概念
1、序列化和反序列化
- 序列化:把对象转换为字节序列的过程称为对象的序列化。
- 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
什么情况下需要序列化?
- 存储数据:当我们想把的内存中的对象状态保存到⼀个文件中或者存到数据库中时。
- 网络传输:网络直接传输数据,但是无法直接传输对象,所以要在传输前序列化,传输完成后反序列化成对象。例如:socket 编程中发送与接收数据。
如何实现序列化?
xml、json、protobuf。
二、ProtoBuf 是什么
官方给出的答案:
Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism forserializing structured data ‒ think XML, but smaller, faster, and simpler. You define how youwant your data to be structured once, then you can use special generated source code toeasily write and read your structured data to and from a variety of data streams and using avariety of languages.
翻译:
Protocol Buffers 是 Google 的一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
Protocol Buffers 类比于 XML,是一种灵活,高效,自动化机制的结构数据序列化方法,但是比 XML 更小、更快、更为简单。
你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。
简单来讲,ProtoBuf(全称为 Protocol Buffer)是让结构数据序列化的方法,其具有以下特点:
语言无关、平台无关:ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台。
高效:比 XML 更小、更快、更为简单。
扩展性、兼容性好:可以更新数据结构,而不影响和破坏原有的旧程序。
三、ProtoBuf 的使用特点
- 编写 .proto 文件,目的是为了定义结构对象(message)及属性内容。
- 使用 protoc 编译器编译 .proto 文件,生成一系列接口代码,存放在新生成头文件和源文件中。
- 依赖生成的接口,将编译生成的头文件包含进我们的代码中,实现对 .proto 文件中定义的字段进行设置和获取,和对 message 对象进行序列化和反序列化。
使用特点:ProtoBuf 是需要依赖通过编译生成的头文件和源文件来使用的。
有了这种代码生成机制,开发人员再也不用吭哧吭哧地编写那些协议解析的代码了(干这种活是典型的吃力不讨好)。