Netty详解(六):Netty 编解码技术
1. 概述
基于Java提供的对象输入/输出流ObjectInputStream和ObjectOutputStream,可以直接把Java对象作为可村粗的字节数组写入文件,也可以传输到网络上去。Java序列化的目的主要有两个:
- 网络传输
- 对象持久化
当进行远程进程服务调用时,需要把传输的Java对象编码为字节数组或者ByteBuffer对象。当远程服务读取到ByteBuffer对象或者字节数组时,需要将其解码为发送的java
对象,这就叫做Java对象编码技术。
2. Java 序列化的缺点
- 无法跨语言:无法跨语言是Java序列化最致命的问题。
- 序列化后的码流太大。
- 序列化的性能太低。
3. 业界主流的编解码技术
3.1 Google的protobuf
protobuf全称Google Protocol Buffers,由谷歌开源而来,将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性。
它的特点如下:
- 结构化数据存储格式(XML,JSON等〉:
- 高效的编解码性能:
- 语言无关、平台无关、扩展性好;
- 官方支持Java、C++和Python三种语言。
Protobut另一个比较吸引人的地方就是它的数据描述文件和代码生成机制,利用数据描述文件对数据结构进行说明的优点如下。
- 文本化的数据结构描述语言,可以实现语言和平台尤关,特别适合异构系统间的集成:
- 通过标识字段的顺序,可以实现协议的前向兼容:
- 自J代码生成,不需要手工编写同样数据结构的C++和Java版本;
- 方便后续的管理和维护。相比于代码,结构化的文档更容易管理和维护。
4. Facebook的Thrift
源于Facebook,支持多种程序,如C++、C#、Cocoa、Erlang、Haskell、Java、Ocami、Perl、PHP、Python、Ruby和Smalltalk。 对于当时的FaceBook来说,创造Thrift是为了解决Facebook各系统间大数据量的传输通信以及系统之间的语言环境不同需要跨平台的特性,因此Thrift可以支持多种语言。
在多种不同的语言之间通信,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编解码框架还是可以以类库的方式独立使用。
5. JBoss Marshalling
JBoss Marshalling 是一个Java对象的序列化API包,修正了JDK自带的序列化包的很多问题,但又保持跟java.io.Serializable接口的兼容,同时,增加了一些可调的参数和附加的特性,并且这些参数和特性可通过工厂类进行配置。
相比如传统的Java序列化机制,它的优点如下:
- 可插拔的类解析器,提供更加便捷的类加载定制策略,通过一个接口就可以实现定制;
- 可插拔的对象替换技术,不需要通过继承的方式;
- 可插拔的预定义类缓存表,可以减少序列化的字节数组长度,提升常用类型的对象序列化性能。
- 无须实现java.io.Serializable接口,即可以实现java序列化。
- 通过缓存技术提升对象的序列化性能。
6. 其他方案
- Kryyo
- Hessian
- FST fast-serialization
- MessagePack(下一章介绍)
Netty详解(六):Netty 编解码技术相关推荐
- 视频技术详解:语音编解码技术演进和应用选型
本文来自现网易云音乐音视频实验室负责人刘华平在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack整理而成.分享中刘华平以时间为主线,讲述了语音编解码技术的演进路 ...
- Netty详解(持续更新中)
Netty详解 1. Netty概述 1.1 Netty简介 1.2 原生NIO问题 1.3 Netty特点 1.4 Netty应用场景 1.3 Netty版本说明 2. Java IO模型 2.1 ...
- 【H.264/AVC视频编解码技术详解】十六:帧内预测编码的基本原理
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
- 【H.264/AVC视频编解码技术详解】二十六、帧间预测编码(4):宏块的帧间预测解码
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
- 【H.264/AVC视频编解码技术详解】七、 熵编码算法(1):基础知识
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
- 【H.264/AVC视频编解码技术详解】二十三、帧间预测编码(1):帧间预测编码的基本原理
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
- 【H.264/AVC视频编解码技术详解】二. 主流视频编码标准的发展
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
- 【H.264/AVC视频编解码技术详解】十七:帧内预测编码的预测实现方法
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
- 【H.264/AVC视频编解码技术详解】十九:熵编码算法(5)——H.264的CABAC(上):语法元素的二值化方法...
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
最新文章
- Web Api学习一
- 冒泡排序java代码_看动画学算法之:排序冒泡排序
- linux 内核调整相关参数
- 第十六周程序阅读(2)
- 新版微信小程序即将上线 新增微信支付功能
- python断言失败_python异常处理、自定义异常、断言原理与用法分析
- 下列哪个不是python元组的定义方式_Python基础知识笔试
- c语言能让制表符空9个字符码,C语言编程规范 – 嗨!大佟!
- 大学生能从计算机游戏中受益,2017年12月英语四级作文范文:大学生玩游戏
- Java之dead code——无用代码
- sql server利用开窗函数over() 进行分组统计
- 机器学习:使用梯度下降实现逻辑回归求解多元分类问题的原理
- [2018.04.23 T3] 最大值
- simulink之S函数
- 使用函数式编程优化代码
- 分布式 | 浅谈 dble 引入 ClickHouse 的配置操作
- Symbian OS s60 3rd编程中实现IMSI、IMEI查询
- JavaScript简单的数据总计怎么做?
- 【JAVA Reference】Finalizer 剖析 (六)
- 删除任务栏锁定,任务栏图标的位置,查找可行性文件的方式