> For the complete documentation index, see [llms.txt](https://jun-wang.gitbook.io/learnjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/web-zhong-jian-jian-xue-xi/netty-de-bian-jie-ma.md).

# Netty的编解码

## 一、Java的序列化技术

java的序列化可以通过实现Serializable接口实现，但是在RPC调用中很晒直接使用java的序列化进行消息的编解码和传输，因为java自身的序列化有一下缺点：

1. 不能跨语言：是java语言内部的私有协议，其他语言比如C++并不支持，当我们进行RPC调用时，其他语言的服务时无法反序列化的；
2. 序列化后的码流太大：通过实验得到java的序列化后大小是二进制数组的5.29倍；
3. 序列化性能低：通过实验得到java序列化的性能大概只有二进制编码的6.17%；

## 二、业界主流的编解码框架

### 2.1 Google的Protobuf

全称Google Protocol Buffers，使用二进制编码，在谷歌内部久经考验。它将数据结构以.proto文件进行描述，通过代码生成工具可以生成对应的数据结构的POJO对象和Protobuf相关的方法和属性。

### 2.2 Facebook的Thrift

Thrift可以作为高性能的通信中间件使用，它支持数据（对象）序列化和多种类型的RPC服务。Thrift适用于静态的数据交换，需要先确定好它的数据结构，当数据结构发生改变时，必须重新编辑IDL文件，生成代码和编译，这一点跟其他IDL工具相比可以是视为是Thrift的弱项。Thrift主要由5部分组成：

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

### 2.3 JBoss Marshalling

是一个java对象序列化的API包，修正了jdk自带的序列化包的很多问题，相对于传统java序列化机制，优点如下：

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

相对于前两种框架，JBoss Marshalling更多是在JBoss内部使用，应用范围有限，但是使用非常简单。
