序列化以及序列化协议

序列化

序列化(serialization、marshalling)的过程是指将数据结构或者对象的状态转换成可以存储(比如文件、内存)或者传输的格式(比如网络)。反向操作就是反序列化(deserialization、unmarshalling)的过程。

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

JSON(Javascript Object Notation)

XML:(Extensible Markup Language)

protobuf

Google提供的一个开源序列化框架,Protobuf具备了优秀的序列化协议的所需的众多典型特征:
* 1、标准的IDL和IDL编译器,这使得其对工程师非常友好。
* 2、序列化数据非常简洁,紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。
* 3、解析速度非常快,比对应的XML快约20-100倍。
* 4、提供了非常友好的动态库,使用非常简介,反序列化只需要一行代码。

Thrift

Thrift是Facebook开源提供的一个高性能,轻量级RPC服务框架,其产生正是为了满足当前大数据量、分布式、跨语言、跨平台数据通讯的需求。 但是,Thrift并不仅仅是序列化协议,而是一个RPC框架。

比较

  • 序列化和反序列化的效率:protobuf高于json,json高于xml;
  • 可读性:json最简单,xml相对复杂一些,但是他们都好于protobuf的二进制格式;
  • 编码复杂度:xml高于json和protobuf,至于json和protobuf,流程上protobuf要复杂些,json只要引入相应的库就行了,而protobuf首先要按规则写消息结构,然后编译成相应的类。

选型建议

以上描述的五种序列化和反序列化协议都各自具有相应的特点,适用于不同的场景:

1、对于公司间的系统调用,如果性能要求在100ms以上的服务,基于XML的SOAP协议是一个值得考虑的方案。
2、基于Web browser的Ajax,以及Mobile app与服务端之间的通讯,JSON协议是首选。对于性能要求不太高,或者以动态类型语言为主,或者传输数据载荷很小的的运用场景,JSON也是非常不错的选择。
3、对于调试环境比较恶劣的场景,采用JSON或XML能够极大的提高调试效率,降低系统开发成本。
4、当对性能和简洁性有极高要求的场景,Protobuf,Thrift之间具有一定的竞争关系。
5、对于T级别的数据的持久化应用场景,Protobuf首要选择。
6、对于持久层非Hadoop项目,以静态类型语言为主的应用场景,Protobuf会更符合静态类型语言工程师的开发习惯。
7、如果需要提供一个完整的RPC解决方案,Thrift是一个好的选择。
8、如果序列化之后需要支持不同的传输层协议,或者需要跨防火墙访问的高性能场景,Protobuf可以优先考虑。

个人总结

如果让我选型,我会在JSON和protobuf之间做选择,json是通用,对性能要求严苛的话,选protobuf。
但是一般的并发量,其实JSON也是可以胜任的,具体到接口的性能,更多是看业务逻辑的设计和书写。

(完)

发表评论

邮箱地址不会被公开。 必填项已用*标注