一、初识 ProtoBuf
1.1序列化的概念
序列化和反序列化
- 序列化:把对象转换为字节序列的过程 称为对象的序列化。
- 反序列化:把字节序列恢复为对象的过程 称为对象的反序列化。
什么情况下需要序列化
- 存储数据:当你想把的内存中的对象状态保存到一个文件中或者存到数据库中时。
- 网络传输:网络直接传输数据,但是无法直接传输对象,所以要在传输前序列化,传输完成后反序列化成对象。例如我们之前学习过 socket 编程中发送与接收数据。
如何实现序列化
- xml、json、 protobuf
1.2ProtoBuf 是什么
官方答案:
Protocol Buffers 是 Google 的一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Protocol Buffers 类比于 XML,是一种灵活,高效,自动化机制的结构数据序列化方法,但是比XML 更小、更快、更为简单。你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。
简单来讲, ProtoBuf(全称为 Protocol Buffer)是让结构数据序列化的方法,其具有以下特点:
- 语言无关、平台无关:即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台。
- 高效:即比 XML 更小、更快、更为简单。
- 扩展性、兼容性好:你可以更新数据结构,而不影响和破坏原有的旧程序。
- ProtoBuf 是需要依赖通过编译生成的 JAVA 代码来使用的。
1.3ProtoBuf 的使用特点
1. 编写 .proto 文件,目的是为了定义结构对象(message)及属性内容。
2. 使用 protoc 编译器编译 .proto 文件,生成一系列接口代码。
3. 依赖生成的接口,实现对 .proto 文件中定义的字段进行设置和获取,和对 message 对象进行序列化和反序列化。
总的来说:ProtoBuf 是需要依赖通过编译生成的 JAVA 代码来使用的。有了这种代码生成机制,开发人员再也不用吭哧吭哧地编写那些协议解析的代码了(干这种活是典型的吃力不讨好)。