编码格式对比

发布 : 2024-11-14

包含自描述信息

1. JSON (JavaScript Object Notation)

JSON格式是1999年ECMA-262的子集合,由 Douglas Crockford 提出。

基本数据类型:

  • 数值:符合IEEE754的十进制数,不能有前导0,可以为负数,可以有小数部分。还可以用e或者E表示指数部分。不能包含非数,如NaN。不区分整数与浮点数。JavaScript用双精度浮点数表示所有数值。
  • 字符串:以双引号""括起来的零个或多个Unicode码位。支持反斜杠开始的转义字符序列。
  • 布尔值:表示为 true 或者 false
  • 数组:有序的零个或者多个值。每个值可以为任意类型。数组使用方括号 [] 包裹。多个数组元素之间用逗号 , 分隔,形如:[value, value]
  • 对象:若干无序的“键-值对”,其中键只能是字符串。建议但不强制要求对象中的键是独一无二的。对象以花括号 {} 包裹。多个键-值对之间使用逗号,分隔。键与值之间用冒号 : 分隔。
  • 空值:值写为 null
优点
  1. 自描述,人类可阅读性高
  2. 几乎所有与网络开发相关的语言都有JSON函数库。
缺点
  1. 整型最大,浮点型最大
  2. 不支持二进制数据

2. MessagePack

基本数据类型:

  • 空值nil
  • 布尔值, 表示为 true 或者 false
  • 整型, 最大64位有符号或无符号整数
  • 浮点型, IEEE单双精度浮点
  • 字符串, UTF-8 字符串
  • 二进制, 最大 ($2^{32}-1$)4294967295 字节
  • 数组
  • 对象, 关系数组
  • 扩展类型 ext type
  • 时间 ext type = -1

以二进制形式,用于表示简单的数据结构,如数组和关系数组。旨在尽可能紧凑和简单。

优点
  1. 编解码自描述
  2. 体积小
  3. 速度快
  4. 支持二进制编码
缺点
  1. 人类可阅读性差
  2. 额外引包 (msgpack 官方提供了多种语言)

3. CBOR (Concise Binary Object Representation)

CBOR的灵感来自Message Pack。
一种简洁二进制对象表示格式,其设计目标包括极小的代码体积、相当小的消息体积以及无需版本协商的可扩展性。

优点
  1. 编解码自描述
  2. 体积小
  3. 速度快
  4. 支持二进制编码
  5. 占用资源少
缺点
  1. 人类可阅读性很差
  2. 大部分语言需要依靠第三方实现

4. XML (Extensible Markup Language)

可扩展标记语言是一种标记语言和用于存储、传输和重构松散数据的文件格式。它定义了一系列编码文档的规则以使其在人类可读的同时机器可读。万维网联盟于1998年发布的 XML 1.0 规范和其他相关开源标准共同定义了 XML。

关键术语

  • 字符( Character )
  • 处理器( Processor )与应用( Application )
  • 标记( Markup )与内容( Content )
  • 标签( Tag )
  • 元素( Element )
  • 属性( Attribute )
  • XML 声明( Declaration )
优点
  1. 编解码自描述,可阅读性高
  2. 易于编写,作为配置文件
缺点
  1. 占用空间大,重复字符多
  2. 结构不灵活

不包含自描述信息

1. Protobuf (Protocol Buffers)

像JSON一样,只是它更小、更快,并且需要生成本地语言绑定。

优点
  1. 编解码速度快
  2. 占用体积小
  3. 支持二进制编码
缺点
  1. 接发双方均需要预定义结构

基本数据类型:

  • 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)
JSONECMA-404一般
MessagePack-
CBORRFC 8949
XMLRFC 7303
ProtobufRFC 7303不可阅读
本文作者 : 萧逸雨
原文链接 : http://qiubo.ink/2024/11/14/编码格式对比/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!