Hessian、Msgpack 和 JSON 实例对比
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.
Hessian、Msgpack 和 JSON 实例对比
前段时间,翻译了 Hessian 2.0 的序列化协议,发布在了 Hessian 2.0 序列化协议(中文版)。但是,其中有很多言语不详之处。所以,接下来会用几篇文章来详细解释并实践一下 Hessian 序列化协议,以求做到知其然知其所以然。
目录如下:
Hessian 协议解释与实战(一):布尔、日期、浮点数与整数 — 介绍布尔型数据、日期类型、浮点类型数据和整数类型数据等四种类型的数据的处理。
Hessian 协议解释与实战(二):长整型、二进制数据与 Null — 介绍长整数类型数据、二进制数据和
null
等三种类型的数据的处理。Hessian 协议解释与实战(三):字符串 — 专门介绍了关于字符串的处理。由于字符串需要铺垫的基础知识比较多,处理细节也有繁琐,所以单独成篇来介绍。
Hessian 源码分析(Java) — 开始第四篇分析之前,先来介绍一下 Hessian 的源码实现。方便后续展开说明。
Hessian 协议解释与实战(四):数组与集合 — 铺垫了一些关于实例对象的处理,重点介绍关于数组和集合的相关处理。
Hessian 协议解释与实战(五):对象与映射 — 重点介绍关于对象与映射的相关处理。
Hessian、Msgpack 和 JSON 实例对比 — 用实例对比 JSON、Hessian 和 MessagePack 的区别。
未完待续,敬请继续关注 "地瓜哥"博客网。
本文用实际来对比一下 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 | 与 ⑧ 相同,类型应用标志符 + 类型编号; |
18 | BigDecimal 的 value 字段的值。在 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
1 | ArrayList 前置标志符 |
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 | 与 ⑧ 相同,类型应用标志符 + 类型编号; |
18 | BigDecimal 的 value 字段的值。在 Hessian 原始库中使用 StringValueSerializer 来序列化 BigDecimal 。 |
19 | 实例引用前置标志符 |
20 | 实例编号 |
看在D瓜哥码字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
欢迎关注D瓜哥的微信公众号(更新巨慢,欢迎留言):
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。如果图片加载不出来可以直接通过搜索微信号来查找D瓜哥的公众号。 |
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK