一、编码和解码
编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码。
编解码器(codec)的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据。
二、Netty 的编解码器
Netty 自身提供了一些 codec(编解码器),Netty 提供的编码器有:
StringEncoder:对字符串数据进行编码
ObjectEncoder:对 Java 对象进行编码
…
Netty 提供的解码器:
StringDecoder:对字符串数据进行解码
ObjectDecoder:对 Java 对象进行解码
…
Netty 本身自带的 ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,底层使用的仍是 Java 序列化技术 , 而Java 序列化技术本身效率就不高,存在如下问题:
①无法跨语言
②序列化后的体积太大(是二进制编码的 5 倍多)
③序列化性能太低
三、Protobuf
Protobuf 是 Google 发布的开源项目,全称 Google Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据的串行化,或者说序列化。它很适合做数据存储或 RPC(远程过程调用)的数据交换格式 。参考指南。
Protobuf 是以 message 的方式来管理数据的;支持跨平台、跨语言(即客户端和服务器端可以是不同的语言编写的),支持目前绝大多数语言,例如 C++、C#、Java、python 等;而且具有高性能和高可靠的特性。
使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述(在idea 中编写 .proto 文件时,会自动提示是否下载 .ptotot 编写插件. 可以让语法高亮),然后通过 protoc.exe 编译器根据.proto 自动生成 .java 文件。
使用时需引入依赖:
compile 'com.google.protobuf:protobuf-java:3.6.1'
Protobuf 是跨平台数据传输的一种方式,但使用起来略微复杂,大部分情况下使用 JSON 进行数据交互。