java.io.Serializable 实现了Java的序列化,但有无法跨语言、序列化后的码流太大、序列化性能太低等缺点
业界主流的编解码框架
Google的protobuf
由谷歌开源而来,将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性。
特点如下:
- 结构化数据存储格式(XML、JSON等)
- 高效的编解码性能
- 语言无关、平台无关、扩展性好
- 官方支持Java、C++和Python三种语言
Protobuf使用二进制编码,在空间和性能上比XML具有更大的优势。
Facebook的Thrift
源于Facebook,支持多种程序,如C++、C#、Cocoa、Erlang、Haskell、Java、Ocami、Perl、PHP、Python、Ruby和Smalltalk。
在多种不同的语言之间通信,Thrift可以作为高性能的通信中间件使用,它支持数据(对象)序列化和多种类型的RPC服务。Thrift适用于静态的数据交换,需要先确定好它的数据结构,当数据结构发生变化时,必须重新编辑IDL文件,生成代码和编译。这一点跟其它IDL工具相比可以视为是Thrift的弱项。Thrift适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输,相对于JSON和XML在性能和传输大小都有明显的优势 。
Thrift主要有5部分组成
- 语言系统以及IDL编译器:负责由用户给定的IDL文件生成相应语言的接口代码
- TProtocol:RPC的协议层,可以选择多种不同的对象序列化方式,如JSON和Binary
- TTransport:RPC的传输层,同样可以选择不同的传输层实现,如socket、NIO、MemoryBuffer等
- TProcessor:作为协议层和用户提供的服务实现之间的纽带,负责调用服务实现的接口
- TServer:聚合TProtocol、TTransport和TProcessor等对象
我们重点关注的是编解码框架,与之对应的就是TProtocol。由于 Thrift的RPC服务调用和编解码框架绑定在一起,所以通常使用Thrift的时候会采取RPC框架的方式,但是它的TProtocol编解码框架还是可以以类库的方式独立使用。
JBoss Marshalling
是一个Java对象的序列化API包,修正了JDK自带的序列化包的很多问题,但又保持跟java.io.Serializable接口的兼容,同时,增加了一些可调的参数和附加的特性,并且这些参数和特性可通过工厂类进行配置。
相比于前两种方案,JBoss Marshalling更多是在JBoss内部使用,应用范围有限。其使用非常简单。
主流编解码框架对比
本文对比了Google的protobuf、Facebook的Thrift和JBossMarshalling等主流编解码框架的特点与应用场景。protobuf具备高效的编解码性能和良好的跨语言支持;Thrift适用于搭建大型数据交换及存储的通用工具,在性能和传输大小方面优于JSON和XML;而JBossMarshalling则针对Java对象序列化进行了优化。
2382

被折叠的 条评论
为什么被折叠?



