序列化一般用在网络传输或者对象持久化中,通过将对象序列化为二进制数据在网络层传输或者保存。
java的jdk为我们开发提供了序列化方案,但是java提供的默认的序列化方法有很多弊端,在性能要求很高的系统中,不是一个好的方案。java默认的序列化方案有以下弊端:
1、无法跨语言
对于java序列化后的字节数组,别的语言无法反序列化,比如服务提供者用java序列化对象给c++调用者,c++调用者则无法反序列化;
2、序列化后的码流太大
java默认方式序列化后的字节数组大小偏大,存储占空间,传输占带宽
3、序列化性能太低
序列化速度相对较慢
因此很多公司开发了自己的序列化框架,并且开源了,目前业界主流的有以下几种序列化框架:
Google 的 Protobuf:
它将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性
特点如下:
1、结构化存储格式(xml.json)
2、高效的编解码功能
3、语言无关,平台无关,扩展性好
4、官方支持java.c++和python
Facebook的Thrift
在多种不同的语言之间的通信,Thrift可以作为高性能的通信中间件使用,它支持数据序列化和多种类型的RPC服务
Thrift支持三种比较典型的编解码方式:
1、通用的二进制编解码
2、压缩二进制编解码
3、优化的可选字段压缩编解码
JBoss 的Marshalling
JBoss Marshalling是一个Java对象的序列化API包,修正了JDk自带的序列化包的很多问题,但又保持跟java.io.Serializable接口的兼容
特点:
无需实现java.io.Serializable接口,即可实现java序列化
通过缓存技术提升对象 的序列化性能
但是更多在JBoss内部使用,应用范围有限
整理总结自Netty权威指南第二版