1

Hessian、Msgpack 和 JSON 实例对比

 2 years ago
source link: https://www.diguage.com/post/hessian-vs-msgpack-vs-json/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Hessian、Msgpack 和 JSON 实例对比

2022-08-05
Hessian、Msgpack 和 JSON 实例对比

前段时间,翻译了 Hessian 2.0 的序列化协议,发布在了 Hessian 2.0 序列化协议(中文版)。但是,其中有很多言语不详之处。所以,接下来会用几篇文章来详细解释并实践一下 Hessian 序列化协议,以求做到知其然知其所以然。

目录如下:

  1. Hessian 协议解释与实战(一):布尔、日期、浮点数与整数 — 介绍布尔型数据、日期类型、浮点类型数据和整数类型数据等四种类型的数据的处理。

  2. Hessian 协议解释与实战(二):长整型、二进制数据与 Null — 介绍长整数类型数据、二进制数据和 null 等三种类型的数据的处理。

  3. Hessian 协议解释与实战(三):字符串 — 专门介绍了关于字符串的处理。由于字符串需要铺垫的基础知识比较多,处理细节也有繁琐,所以单独成篇来介绍。

  4. Hessian 源码分析(Java) — 开始第四篇分析之前,先来介绍一下 Hessian 的源码实现。方便后续展开说明。

  5. Hessian 协议解释与实战(四):数组与集合 — 铺垫了一些关于实例对象的处理,重点介绍关于数组和集合的相关处理。

  6. Hessian 协议解释与实战(五):对象与映射 — 重点介绍关于对象与映射的相关处理。

  7. Hessian、Msgpack 和 JSON 实例对比 — 用实例对比 JSON、Hessian 和 MessagePack 的区别。

  8. 未完待续,敬请继续关注 "地瓜哥"博客网

本文用实际来对比一下 JSON、Hessian 和 MessagePack 的区别。

序列化单个实例

MessagePack

1预留
2表示一个对象的开始,同时也表示有四个字段;
3第一个字段 id 的值 4
4第二个字段 name 类型及字段长度 7,MsgPack 直接使用 UTF-8 对字符串进行编码;关于字符串编码,请看: 细说编码与字符集
5第三个字段 birthday 类型,日期类型,后面紧跟八个字节表示精确到毫秒的时间戳;
6第四个字段 money 类型及字段长度。在 MsgPack 原生的 Jar 包,提供了 BigDecimalTemplate 来处理 BigDecimal 数据,它将 BigDecimal 处理成字符串。所以,这里的类型和第二个字段 name 的类型是一样的。

Hessian

1预留
2类型声明,声明这是一个实例对象。关于类型进行 Hessian 编码的详细解释请看 Hessian 协议解释与实战(四):数组与集合。后面不再赘述。
3类型名称,Hessian 直接将类型名称编码为字符串,字符串长度小于 32 时,直接使用 int 后八位。
4字段数量
5第一个字段的名称: id
6第二个字段的名称: name
7第三个字段的名称: birthday;
8第四个字段的名称: money
9类型应用标志符 + 类型编号;
10第一个字段 id 的值 4
11第二个字段 name 的值,第一个字节是长度标识符。Hessian 对字符串的编码处理比较特殊,详情请看: Hessian 协议解释与实战(三):字符串。个人觉得,不如直接使用 UTF-8 编码简单。
12第三个字段 birthday 的值,首位是日期标识符,后面紧跟八个字节表示精确到毫秒的时间戳;
13开始序列化第四个字段。这里与 ① 相同,都是类型声明,声明这是一个实例对象。
14与 ② 相同,都是类型名称,Hessian 直接将类型名称编码为字符串。
15字段数量
16字段名称
17与 ⑧ 相同,类型应用标志符 + 类型编号;
18BigDecimalvalue 字段的值。在 Hessian 原始库中使用 StringValueSerializer 来序列化 BigDecimal

序列化集合

MessagePack

1表示有两个元素。
2表示一个对象的开始,同时也表示有四个字段;
3第一个字段 id 的值 4
4第二个字段 name 类型及字段长度 7,MsgPack 直接使用 UTF-8 对字符串进行编码;关于字符串编码,请看: 细说编码与字符集
5第三个字段 birthday 类型,日期类型,后面紧跟八个字节表示精确到毫秒的时间戳;
6第四个字段 money 类型及字段长度。在 MsgPack 原生的 Jar 包,提供了 BigDecimalTemplate 来处理 BigDecimal 数据,它将 BigDecimal 处理成字符串。所以,这里的类型和第二个字段 name 的类型是一样的。

Hessian

1ArrayList 前置标志符
2类型声明,声明这是一个实例对象。关于类型进行 Hessian 编码的详细解释请看 Hessian 协议解释与实战(四):数组与集合。后面不再赘述。
3类型名称,Hessian 直接将类型名称编码为字符串,字符串长度小于 32 时,直接使用 int 后八位。
4字段数量
5第一个字段的名称: id
6第二个字段的名称: name
7第三个字段的名称: birthday;
8第四个字段的名称: money
9类型应用标志符 + 类型编号;
10第一个字段 id 的值 4
11第二个字段 name 的值,第一个字节是长度标识符。Hessian 对字符串的编码处理比较特殊,详情请看: Hessian 协议解释与实战(三):字符串。个人觉得,不如直接使用 UTF-8 编码简单。
12第三个字段 birthday 的值,首位是日期标识符,后面紧跟八个字节表示精确到毫秒的时间戳;
13开始序列化第四个字段。这里与 ① 相同,都是类型声明,声明这是一个实例对象。
14与 ② 相同,都是类型名称,Hessian 直接将类型名称编码为字符串。
15字段数量
16字段名称
17与 ⑧ 相同,类型应用标志符 + 类型编号;
18BigDecimalvalue 字段的值。在 Hessian 原始库中使用 StringValueSerializer 来序列化 BigDecimal
19实例引用前置标志符
20实例编号

看在D瓜哥码字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

微信打赏码
支付宝打赏码

欢迎关注D瓜哥的微信公众号(更新巨慢,欢迎留言):

微信公众号
公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。如果图片加载不出来可以直接通过搜索微信号来查找D瓜哥的公众号。
来说两句吧...
我来说两句

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK