Data Interchange Format


数据交换格式本质上是:让不同程序、语言、系统、机器之间能够稳定交换数据的一套编码规则

维度 classification代表技术 Representative核心特征 & 适用场景 Key Features
文本型 (Text-based)JSON, XML, YAML, CSV, TOML可读性强,人类友好,易于调试,但解析开销大、体积大
二进制型 (Binary)Protocol Buffers, MessagePack, FlatBuffers高性能、紧凑、省带宽,但不可读,依赖工具链
自描述型 (Self-describing)XML, JSON数据本身包含结构信息(Key-Value 结构),灵活性高
Schema驱动 (Schema-driven)Protobuf, Avro, Thrift强类型,依赖 IDL 定义,具备可演化性与严格契约
表格/列式 (Columnar/Tabular)CSV, Apache Parquet, ORC二维或多维数据,针对大数据分析、列式存储深度优化
配置型 (Configuration)TOML, INI, YAML极高的人类阅读和修改友好度,多用于系统初始化
领域特定 (Domain-specific)glTF, FBX (游戏图形)专为特定工业领域(如3D资产、地理信息)定制的交换标准
通信层 (IPC/RPC/Web)JSON, GraphQL, gRPC (Protobuf)针对网络传输、微服务通信、前后端交互优化的协议

所有数据交换格式,本质都在解决

内存对象
v
可传输表达
v
另一端恢复对象

Object <-> Byte Stream

这就是序列化/反序列化

为什么会有这么多的数据交换格式?
没有任何一个数据交换格式是完美的,所有的数据交换格式都在以下几个维度做权衡:

  • 可读性
  • 空间效率
  • 解析速度
  • Schema能力
  • 向后兼容(演进)
  • 流式处理
  • 零拷贝
  • 调试能力
  • 跨语言
  • 工具链成熟度

很多人对数据交换格式的理解停留在语法和文件格式上,没有对其进行深入研究过
数据格式表面上只是“数据的排列方式”,在底层上牵扯到内存布局,缓存命中等问题;它能决定一家公司数十万台服务器的生死
数据格式的研究价值主要集中在三个核心方向:

  • 极致的性能优化
  • 优雅的工程结构
  • 对计算机底层本质的理解

极致的性能优化

当数据量极其庞大时,数据格式的微小改变会直接带来数百万美元的成本差异\

内存布局与CPU缓存友好度

在现代计算机架构中,CPU访问内存的速度远慢于CPU自身的计算速度。为了解决这个问题,CPU会把内存数据一块块加载到高速缓存(Cache)中

  • 行存 vs 列存:大数据存储,比如Apache Parquet,它把传统的表格“按列”连续存储。如果要计算某个字段的平均值,CPU缓存里全是这一列的数据,没有多余的废信息,还能让查询性能暴增百倍
  • 内存对齐(Padding):底层二进制格式必须研究数据如何在内存里对齐。例如一个1字节的char和一个4字节的int放在一起,如果排列不当,CPU需要发起两次内存访问才能读完一个变量

序列化与反序列化的零拷贝(Zero-Copy)

把内存中的对象变成二进制流叫序列化,反之叫反序列化。像JSON这种格式,反序列化时必须经历“读取字符串 -> 字符解析 -> 在堆内存分配新对象 -> 填入数据”的繁琐过程,非常消耗CPU

  • FlatBuffers/Cap’n Proto: Google 开发的 FlatBuffers 等格式实现了零拷贝。它在编码时就直接把数据按照内存对齐的二进制结构排好。接收方收到数据后,甚至不需要反序列化,直接把这段二进制数据的指针强制类型转换(Cast)成结构体指针,就能直接读取。这种“不解析直接用”的机制在游戏开发和高频交易中是核心技术

优雅的工程结构:版本演进与兼容性(Schema Evolution)

更改一个API的数据结构,你不可能要求所有在跑的服务器同时停机升级
如何让老代码能读新数据,新代码能读老数据?这就是Schema演进的研究价值

  • 前向兼容与后向兼容:Protobuf, Avro等格式引入了“序号(Field Tags)”或“版本Schema注册表”。它们不依赖字段名,而是依赖数字代号。当新服务发出带有新字段的数据时,老服务会自动忽略不认识的代号,保证系统不崩溃

对计算机底层与系统设计的本质理解

深入研究数据格式,本质上是在训练一种“在限制中寻找最优解”的架构思维

文本 vs 二进制的哲学辩证

  • Unix的哲学之一是:“尽量使用文本流,因为它是通用的接口”。白底黑字的纯文本对人类友好、易于管道(Pipe)组合、易于调试
  • 但现代高并发架构又不得不向二进制的性能妥协。在设计一个系统时,什么时候该用人类可读的格式(如YAML配置文件),什么时候该用及其高效的格式(如协议层二进制),这种权衡的艺术非常值得琢磨