Netty权威指南–编解码技术

2018/03 12 13:03

Java序列化的目的主要有两个:

  1. 网络传输
  2. 对象持久化

Java序列化的缺点

  1. 无法跨语言
  2. 序列化后的码流太大
  3. 序列化性能太低

业界主流的编解码框架

1. Google的Protobuf介绍

特点:

  • 结构化数据存储格式*(XML,JSON等)
  • 高效的编解码性能
  • 语言无关\平台无关\扩展性号
  • 官方支持Java,C++和Python三种语言

Protobug另一个比较吸引人的地方就是他的数据描述文件和代码生成机制,利用数据描述文件对数据结构进行说明的有点如下:

  • 文本化的数据结构描述语言,可以实现语言和平台无关,特别适合易购系统间的集成
  • 通过表示字段的顺序,可以实现协议的前向兼容
  • 自动代码生成,无需要手动编写相同数据结构的diamante
  • 方斌啊厚些的管理和维护.对比于代码,结构化的文档更容易管理和维护

2. Facebook的Thrift介绍

Thrift主要由5部分组成

  • 语言系统以及IDL编译器:负责由用户给定的IDL文件生成相应语言的接口代码
  • TProtocol:RPC的协议层,可以选着多种不同的对象序列化方式,如JOSN和Binary
  • TTransport:RPC的传输层,同样可以选择不同的传输层实现,如:socket\NIO\MemoryBuffer等
  • TProcessor:作为协议层和用户提供的服务实现中间的纽带,负责调用服务实现的接口
  • TServer:聚合TProtocol\TTransport和TProcessor等对象

Thrift支持三种比较经典的编解码方式

  • 通用的二进制编解码
  • 压缩二进制编解码
  • 优化的可选字段压缩编解码

3. JBoSS Marshalling介绍

JBoss Marshalling是一个Java对象序列化API包,修正了JDK自带的序列化包的很多问题,但又保持跟java.io.Serializable接口的兼容.同时,增加了一些可调的参数和附加的特性,并且这些参数和特性可通过工厂类进行配置

相比传统Java序列化的有点:

  • 可插拔的类解析器,提供更加便捷的类加载定制策略,通过一个接口即可实现定制.
  • 可插拔的对象替换技术,不需要通过继承的方式
  • 可插拔的预定义类缓存表,可以减小序列化的字节数组长度,提升常用类型的对象序列化性能
  • 无序实现java.io.Serializable接口,即可实现Java序列化
  • 通过缓存技术提升对象的序列化性能

 

--转载请注明: https://www.guangboyuan.cn/netty%e6%9d%83%e5%a8%81%e6%8c%87%e5%8d%97-%e7%bc%96%e8%a7%a3%e7%a0%81%e6%8a%80%e6%9c%af/

发表回复

(必填)