编码格式对比
包含自描述信息
1. JSON (JavaScript Object Notation)
JSON格式是1999年ECMA-262的子集合,由 Douglas Crockford 提出。
基本数据类型:
- 数值:符合IEEE754的十进制数,不能有前导0,可以为负数,可以有小数部分。还可以用e或者E表示指数部分。不能包含非数,如
NaN
。不区分整数与浮点数。JavaScript用双精度浮点数表示所有数值。 - 字符串:以双引号
""
括起来的零个或多个Unicode码位。支持反斜杠开始的转义字符序列。 - 布尔值:表示为
true
或者false
。 - 数组:有序的零个或者多个值。每个值可以为任意类型。数组使用方括号
[]
包裹。多个数组元素之间用逗号,
分隔,形如:[value, value]
。 - 对象:若干无序的“键-值对”,其中键只能是字符串。建议但不强制要求对象中的键是独一无二的。对象以花括号
{}
包裹。多个键-值对之间使用逗号,分隔。键与值之间用冒号:
分隔。 - 空值:值写为
null
优点
- 自描述,人类可阅读性高
- 几乎所有与网络开发相关的语言都有JSON函数库。
缺点
- 整型最大,浮点型最大
- 不支持二进制数据
2. MessagePack
基本数据类型:
- 空值:
nil
- 布尔值, 表示为
true
或者false
。 - 整型, 最大64位有符号或无符号整数
- 浮点型, IEEE单双精度浮点
- 字符串, UTF-8 字符串
- 二进制, 最大 ($2^{32}-1$)
4294967295
字节 - 数组
- 对象, 关系数组
- 扩展类型
ext type
- 时间 ext type = -1
以二进制形式,用于表示简单的数据结构,如数组和关系数组。旨在尽可能紧凑和简单。
优点
- 编解码自描述
- 体积小
- 速度快
- 支持二进制编码
缺点
- 人类可阅读性差
- 额外引包 (msgpack 官方提供了多种语言)
3. CBOR (Concise Binary Object Representation)
CBOR的灵感来自Message Pack。
一种简洁二进制对象表示格式,其设计目标包括极小的代码体积、相当小的消息体积以及无需版本协商的可扩展性。
优点
- 编解码自描述
- 体积小
- 速度快
- 支持二进制编码
- 占用资源少
缺点
- 人类可阅读性很差
- 大部分语言需要依靠第三方实现
4. XML (Extensible Markup Language)
可扩展标记语言是一种标记语言和用于存储、传输和重构松散数据的文件格式。它定义了一系列编码文档的规则以使其在人类可读的同时机器可读。万维网联盟于1998年发布的 XML 1.0 规范和其他相关开源标准共同定义了 XML。
关键术语
- 字符( Character )
- 处理器( Processor )与应用( Application )
- 标记( Markup )与内容( Content )
- 标签( Tag )
- 元素( Element )
- 属性( Attribute )
- XML 声明( Declaration )
优点
- 编解码自描述,可阅读性高
- 易于编写,作为配置文件
缺点
- 占用空间大,重复字符多
- 结构不灵活
不包含自描述信息
1. Protobuf (Protocol Buffers)
像JSON一样,只是它更小、更快,并且需要生成本地语言绑定。
优点
- 编解码速度快
- 占用体积小
- 支持二进制编码
缺点
- 接发双方均需要预定义结构
基本数据类型:
- double:双精度浮点
- float:单精度浮点
- int32:32位整型,可变长度编码
- int64:64 位整型,可变长度编码
- uint32:32位整型,可变长度编码
- uint64:64 位整型,可变长度编码
- sint32:比常规 int32 更有效地编码负值。
- sint64:比常规 int64 更有效地编码负值。
- fixed32:固定4字节。如果值通常大于$2^{28}$,则比uint32更有效。
- fixed64:固定8字节。如果值通常大于$2^{56}$,则比uint32更有效。
- sfixed32:固定4字节。
- sfixed64:固定8字节。
- bool:布尔值
- string:字符串
- bytes:二进制数据
其他类似的格式
1. Apache Thrift
2. Apache Avro
优缺点
格式 | 标准 | 阅读性(0-9) | 易用性(0-9) | 速度(0-9) | 大小(0-9) |
---|---|---|---|---|---|
JSON | ECMA-404 | 高 | 高 | 一般 | 大 |
MessagePack | - | 中 | 高 | 快 | 中 |
CBOR | RFC 8949 | 中 | 高 | 快 | 中 |
XML | RFC 7303 | 高 | 高 | 慢 | 大 |
Protobuf | RFC 7303 | 不可阅读 | 中 | 快 | 小 |
本文作者 : 萧逸雨
原文链接 : http://qiubo.ink/2024/11/14/编码格式对比/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!