序列化一般有两个主要目的:
- 网络传输
- 对象持久化
一般评判一个编解码框架的优劣时,会考虑如下几个因素:
- 是否支持跨语言;
- 编码后的码流大小;
- 编解码性能;
- 类库是否小巧,API 使用是否方便;
- 使用者需要手工开发的工作量和难度;
- 类库的开源性以及社区活跃度;
在同等环境下,编码后的字节数越大,存储的时候就越占空间,存储的硬件成本就越高,并且在网络传输时更占带宽,导致系统的吞吐量降低。
主流编解码框架
Google 的 Protobuf
Protobuf(Google Protocol Buffers),由谷歌开源。它将数据结构以 .proto 文件进行描述,通过代码生成工具可以生成对应数据结构的 POJO 对象和 Protobuf 相关的方法和属性。
它的特点:
- 结构化数据存储格式
- 高效的编解码性能
- 语言无关、平台无关、扩展性好
- 支持的语言比较丰富
对比 XML, 尽管 XML 的可读性和可扩展性非常好,也非常适合描述数据结构,但是 XML 解析的时间开销和 XML 为了可读性而牺牲的空间开销都非常大,因此不适合做高性能的通信协议。Protobuf 使用二进制编码,在空间和性能上具有更大优势。
Facebook 的 Thrift
Thrift 是 Facebook 于2007年开发的跨语言的 rpc 服框架,提供多语言的编译功能,并提供多种服务器工作模式;用户通过 Thrift 的 IDL(接口定义语言)来描述接口函数及数据类型,然后通过 Thrift 的编译环境生成各种语言类型的接口文件,用户可以根据自己的需要采用不同的语言开发客户端代码和服务器端代码。
实战 Protobuf
安装
您将需要 protobuf 的编译器来生成指定语言的代码。
因此需要安装编译器,教程来源:apple/swift-protobuf
$ brew install swift-protobuf
$ protoc --version
libprotoc 3.14.0
.proto
创建 .proto
文件,然后在里面定义消息,再通过 protobuf
编译器生成 Swift
代码。
对于 .proto 文件,我们可以用任意的 IDE 或者文本编辑器进行编辑,个人建议用 VSCode
然后结合 vscode-proto3
插件。
Google protocol buffer 的官方文档:文档
我们简单的创建个 movie.proto
:
这里有一个iOS交流圈:891 488 181 有兴趣的都可以来了解,分享BAT,阿里面试题、面试经验,讨论技术,裙里资料直接下载就行, 大家一起交流学习!
syntax = "proto3";
message Movie {
enum Genre {
COMEDY = 0;
ACTION = 1;
HORROR = 2;
ROMANCE = 3;
DRAMA = 4;
}
string title = 1;
Genre ge