RPC 框架需要通过网络通信实现跨 JVM 的调用。既然需要网络通信,那就必然会使用到序列化与反序列化的相关技术,Dubbo 也不例外。

1 JDK序列化操作

1.1 实现 Serializable 接口

被序列化对象实现 Serializable 接口。

public class Student implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;private transient StudentUtil studentUtil;
}
  • transient 关键字的作用
    在对象序列化过程中忽略被其修饰的成员属性变量。可用来修饰一些非数据型的字段以及一些可以通过其他字段计算得到的值。合理使用 transient,可降低序列化后的数据量,提高网络传输效率。

1.2 生成 serialVersionUID

生成一个序列号 serialVersionUID。该序列号非必需,但推荐生成。serialVersionUID 字面含义是序列化的版本号,只有序列化和反序列化的 serialVersionUID 都相同的情况下,才能够成功地反序列化。若类中没有定义 serialVersionUID,那么 JDK 也会随机生成一个 serialVersionUID。如果在某些场景中,你希望不同版本的类序列化和反序列化相互兼容,那就需要定义相同的 serialVersionUID。

1.3 重写 writeObject()/readObject()

根据需求决定是否要重写 writeObject()/readObject() 方法,实现自定义序列化。

1.4 调用writeObject()/readObject()

调用 java.io.ObjectOutputStream 的 writeObject()/readObject() 进行序列化与反序列化。

Java 本身的序列化操作简单,但第三方序列化框架的速度更快、序列化的效率更高,而且支持跨语言操作。

2 常见序列化算法

Apache Avro

与编程语言无关的序列化格式。Avro 依赖于用户自定义的 Schema,在进行序列化数据的时候,无须多余的开销,就可以快速完成序列化,并且生成的序列化数据也较小。当进行反序列化的时候,需要获取到写入数据时用到的 Schema。在 Kafka、Hadoop 以及 Dubbo 中都可以使用 Avro 作为序列化方案。

FastJson

阿里开源的 JSON 解析库,可以解析 JSON 格式的字符串。它支持将 Java 对象序列化为 JSON 字符串,反过来从 JSON 字符串也可以反序列化为 Java 对象。FastJson 是 Java 程序员常用到的类库之一,正如其名,“快”是其主要卖点。从官方的测试结果来看,FastJson 确实是最快的,比 Jackson 快 20% 左右,但是近几年 FastJson 的安全漏洞比较多,所以你在选择版本的时候,还是需要谨慎一些。

Fst(全称是 fast-serialization)

高性能 Java 对象序列化工具包,100% 兼容 JDK 原生环境,序列化速度大概是JDK 原生序列化的 4~10 倍,序列化后的数据大小是 JDK 原生序列化大小的 1/3 左右。目前,Fst 已经更新到 3.x 版本,支持 JDK 14。

Kryo

高效的 Java 序列化/反序列化库,目前 Twitter、Yahoo、Apache 等都在使用该序列化技术,特别是 Spark、Hive 等大数据领域用得较多。Kryo 提供了一套快速、高效和易用的序列化 API。无论是数据库存储,还是网络传输,都可以使用 Kryo 完成 Java 对象的序列化。Kryo 还可以执行自动深拷贝和浅拷贝,支持环形引用。Kryo 的特点是 API 代码简单,序列化速度快,并且序列化之后得到的数据比较小。另外,Kryo 还提供了 NIO 的网络通信库——KryoNet,你若感兴趣的话可以自行查询和了解一下。

Hessian2

支持动态类型、跨语言的序列化协议,Java 对象序列化的二进制流可以被其他语言使用。Hessian2 序列化之后的数据可以进行自描述,不会像 Avro 那样依赖外部的 Schema 描述文件或者接口定义。Hessian2 可以用一个字节表示常用的基础类型,这极大缩短了序列化之后的二进制流。需要注意的是,在 Dubbo 中使用的 Hessian2 序列化并不是原生的 Hessian2 序列化,而是阿里修改过的 Hessian Lite,它是 Dubbo 默认使用的序列化方式。其序列化之后的二进制流大小大约是 Java 序列化的 50%,序列化耗时大约是 Java 序列化的 30%,反序列化耗时大约是 Java 序列化的 20%。

Protobuf(Google Protocol Buffers)

Google 公司开发的一套灵活、高效、自动化的、用于对结构化数据进行序列化的协议。但相比于常用的 JSON 格式,Protobuf 有更高的转化效率,时间效率和空间效率都是 JSON 的 5 倍左右。Protobuf 可用于通信协议、数据存储等领域,它本身是语言无关、平台无关、可扩展的序列化结构数据格式。目前 Protobuf提供了 C++、Java、Python、Go 等多种语言的 API,gRPC 底层就是使用 Protobuf 实现的序列化。

3 dubbo-serialization

Dubbo 为了支持多种序列化算法,单独抽象了一层 Serialize 层,在整个 Dubbo 架构中处于最底层,对应的模块是 dubbo-serialization 模块。

  • dubbo-serialization 模块

定义了 Dubbo 序列化层的核心接口,其中最核心的是 Serialization 接口,它是一个扩展接口,被 @SPI 接口修饰,默认扩展实现是 Hessian2Serialization。

  • Serialization 接口

Dubbo 提供了多个 Serialization 接口实现,用于接入各种各样的序列化算法

这里我们以默认的 hessian2 序列化方式为例,介绍 Serialization 接口的实现以及其他相关实现。

Hessian2Serialization 中的 serialize() 方法创建的 ObjectOutput 接口实现为 Hessian2ObjectOutput,继承关系如下图所示:

在 DataOutput 接口中定义了序列化 Java 中各种数据类型的相应方法,如下图所示,其中有序列化 boolean、short、int、long 等基础类型的方法,也有序列化 String、byte[] 的方法。

ObjectOutput 接口继承了 DataOutput 接口,并在其基础之上,添加了序列化对象的功能,具体定义如下图所示,其中的 writeThrowable()、writeEvent() 和 writeAttachments() 方法都是调用 writeObject() 方法实现的。

Hessian2ObjectOutput 中会封装一个 Hessian2Output 对象,需要注意,这个对象是 ThreadLocal 的,与线程绑定。在 DataOutput 接口以及 ObjectOutput 接口中,序列化各类型数据的方法都会委托给 Hessian2Output 对象的相应方法完成,实现如下:

public class Hessian2ObjectOutput implements ObjectOutput {private static ThreadLocal<Hessian2Output> OUTPUT_TL = ThreadLocal.withInitial(() -> {// 初始化Hessian2Output对象Hessian2Output h2o = new Hessian2Output(null);        h2o.setSerializerFactory(Hessian2SerializerFactory.SERIALIZER_FACTORY);h2o.setCloseStreamOnClose(true);return h2o;});private final Hessian2Output mH2o;public Hessian2ObjectOutput(OutputStream os) {mH2o = OUTPUT_TL.get(); // 触发OUTPUT_TL的初始化mH2o.init(os);}public void writeObject(Object obj) throws IOException {mH2o.writeObject(obj);}... // 省略序列化其他类型数据的方法
}

Hessian2Serialization 中的 deserialize() 方法创建的 ObjectInput 接口实现为 Hessian2ObjectInput,继承关系如下所示:

Hessian2ObjectInput 具体的实现与 Hessian2ObjectOutput 类似:在 DataInput 接口中实现了反序列化各种类型的方法,在 ObjectInput 接口中提供了反序列化 Java 对象的功能,在 Hessian2ObjectInput 中会将所有反序列化的实现委托为 Hessian2Input。

Dubbo的多种序列化算法相关推荐

  1. java kryo 序列化_java中的序列化方式及dubbo使用kryo序列化

    java中的序列化方式: 1. 自带序列化  ObjectInputSteam. ObjectOutStream等 2. hession2 3. json ,xml等格式 4.kryo 5.FST - ...

  2. Dubbo 支持哪些序列化协议? Hessian 的数据结构?什么是PB ?为什么 PB 的效率是最高的?

    面试题 dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的? 面试官心理分析 上一个问题,说说 dubbo 的基本工作原理 ...

  3. java序列化算法透析_Java序列化机制与原理的深入分析

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

  4. lpp降维算法matlab,dimension-reduct method 多种降维算法,包括lle,lpp,ltsa matlab 238万源代码下载- www.pudn.com...

    文件名称: dimension-reduction-method下载 收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 857 KB 上传时间: 2014-11-05 ...

  5. java序列化算法透析_Java序列化算法透析

    /** *  轉載請注明作者longdick    http://longdick.iteye.com * */ Java 序列化算法透析 Serialization (序列化)是一種將對象以一連串的 ...

  6. 基于linkboy+W801编程实现彩灯带的多种发光算法

    本文中列举的例子相关程序仿真视频和实物视频,可以在bilibili观看,链接为linkboy带你创造流光溢彩的世界_哔哩哔哩_bilibili 前言 春节,路边的树木都挂上彩灯,欢乐喜庆的气氛更加浓郁 ...

  7. 编写代码,实现信用卡诈检测。数据creditcard.csv。要求:使用多种机器学习算法训练模型,并对比结果。根据代和代码果,撰写作业。作业文件格式pdf,把源代码和输出结果拷贝到word文件中,根据

    编写代码,实现信用卡诈检测.数据creditcard.csv.要求:使用多种机器学习算法训练模型,并对比结果.根据代和代码果,撰写作业.作业文件格式pdf,把源代码和输出结果拷贝到word文件中,根据 ...

  8. 各种滤镜算法C语言,JavaScript多种滤镜算法实现代码实例

    这篇文章主要介绍了JavaScript多种滤镜算法实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.灰色滤镜 设定R,G,B值相等 f ...

  9. ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例

    ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 目录 基于鸢尾花(Iris)数据集利用多种降维算法(PCA ...

最新文章

  1. 动画版RNN、LSTM和GRU计算过程
  2. 产业AI实践中,如何有效提升图像识别精度、实现极小目标检测? | 百度AI公开课报名...
  3. 【数据结构-查找】4.五千字干活长文带你搞懂——B树和B+树
  4. 在ABAP中将负号提前的方法
  5. 8-13 刷题 复习 知识点集合
  6. Nacos客户端配置
  7. 再次携号转网_潍坊一小伙欲携号转网屡被拒 联通客服:试运营状态不支持携转...
  8. [转]关于sizeof()的一些思考
  9. hanoi塔java_Java实现hanoi塔
  10. 安卓采集摄像头画面生成MP4文件
  11. 看门狗超时前在内核打印信息
  12. mysql数据库工程师考证题_100道MySQL常见面试题总结
  13. assert.notDeepEqual()
  14. jQuery 倒计时插件
  15. 1024,身为程序员的我们更应该思考如何放慢脚步
  16. ARTS 2019 05 05 (29)
  17. 敏捷团队的病与药——阿里健康医药B2B团队敏捷转型手记
  18. chatgpt平替,清华chatglm本地化部署教程(aigc大模型风口,校招找工作必备),包含weiui部署,api部署,对话框部署
  19. CloudFlare Workers 设置使用自定义域名
  20. 基于OpenAI的Chatbot开发记录

热门文章

  1. vbs 打开指定浏览器网页
  2. 安卓模拟ibeacon_【首发】联接真实与虚拟世界:Estimote Beacons Developer Kit 低功耗蓝牙开发套件...
  3. python读取压缩文件的大小_python查看zip包中文件及大小的方法
  4. 程序后台运行没问题,但是sql没有执行,查询数据为空
  5. 悟透Javascript(转载)
  6. SAP客户主数据相关表
  7. OracleDataAdapter.Fill()处于无限等待中 【已解决】
  8. java如何等待异步结果_你如何等待所有异步调用在Java中完成?
  9. 欠债还钱,天经地义(二)
  10. spring cloud 总结(摘抄版)