目录
一、序列化和反序列化
我们在开发一些远程过程调用(RPC)的程序时,通常会涉及对象的序列化和反序列化问题。
序列化:
java对象---> json格式的结构化字符串--->字节流
java对象--->xml格式的字符串--->字节流
java对象--->protobuf格式的二进制数据--->字节流
反序列化:
字节流--->json格式的结构化字符串--->java对象
字节流--->xml格式的字符串--->java对象
字节流--->protobuf格式的二进制数据--->java对象
1、Java开发中序列化和反序列化的工具
java处理JSON数据有三个比较流行的开源类库:阿里的FastJson、谷歌的Gson和开源社区的Jackson。
1、使用jackson开源库,可以轻松将java的POJO对象转换成JSON、XML格式的字符串;同样也可以方便的将JSON、XML字符串转换成java的POJO对象。
2、谷歌的开源库Gson是一个功能齐全的JSON解析库,起源于Google公司内部需要而研发。2008年5月第一版发布以来已经被许多公司所采用。Gson可以完成复杂类型的POJO和JSON字符串的互相转换,转换的能力非常强。
3、阿里巴巴的FastJson是一个高性能的JSON库。从性能上说,FastJson库采用独创的算法,将JSON转换成POJO的速度提升到极致,超过其他的JSON开源库。
选取的策略:
在实际开发中,目前主流的策略是:Google的Gson库和阿里的FastJson库两者结合使用。在POJO序列化成JSON字符串的应用场景,使用Google的Gson库;
在JSON字符串反序列化成POJO的应用场景,使用阿里的FastJson库。
总而言之:序列化看谷歌,反序列化看阿里。
2、分布式场景下的数据通信或者异构环境下的数据交换
与JSON、XML相比,Protobuf算是后起之秀,是Goolge开源的一种数据格式。只是Protobuf更加适合于高性能、快速响应的传输应用场景。
显然:Protobuf也没什么神奇的,他只是一种数据的组织格式,既然有组织格式就必须有协议,而协议其实就是通信双方约定的规则而已,你不按照规则发送,我就不接受。
JSON、XML是文本格式,数据具有可读性,但是体积较大;
Protobuf是二进制数据格式,可读性差,但是体积小;
在需要大量传输数据的场景中,因为数据量大,那么选择Protobuf可以明显的减少传输的数据量、提升网络IO的速度。
Protobuf的另外一个特点是:既独立于语言,又独立于平台。
3、编码器和解码器
1、ProtobufEncoder编码器和ProtobufDecoder解码器;
缺点:存在粘包和半包的问题。
2、ProtobufVarint32LengthFieldPrepender长度编码器和ProtobufVarint32FrameDecoder长度解码器;
可以解决粘包和半包的问题。
3、自定义的Protobuf编码器和解码器
复杂场景:在Head部分加上魔数据字段进行安全验证或者需要对Protobuf Data的内容进行加密和揭秘等。