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配置文件),什么时候该用及其高效的格式(如协议层二进制),这种权衡的艺术非常值得琢磨