Appearance
数据编码格式
前后兼容性
- 向前/向后兼容
- 数据兼容性
- 代码兼容性
数据的存在形式
程序通常使用( 至少)两种不同的数据表示形式
内存中
数据保存在对象、结构体、列表 数组、哈希表和树等结构中。这些 数据结构针对 CPU 高效访问和操作进行了优化(通常使用指针)。
字节序列
- 网络
- 磁盘
将数据写入文件或通过网络发送时,必须将其编码为某种自包含的字节序列。由于指针对其他进程没有意义,所以这个字节序列表示看起来 与内存中使用的数据结构大不一样。
在这两种表示之间需要进行类型的转化。从内存中的表示到字节序列的转化称 为编码(或序列化等),相反的过程称为解码(或解析,反序列化)。
常见转换方式
语言特定的格式
每个语言基本都自带了一些自己实现的序列化方法同时也有很多第三方库的支持
System.Text.Json.Serialization
Newtonsoft.Json
优点: 方便
缺点: 语言绑定/效率低/兼容性/被攻击
JSON,XML与二进制变体 eg:
拿JSON举例
- 优点: 网络通行方便/不依赖语言
- 缺点: 安全性/二进制数据 eg:
Protocol Buffers eg: eg:
Avro eg: 相比于protobuf 它没有标签编号,数据传输的时候也没有数据类型,有的只是length。 Avro定义了读模式和写模式,作用是在使用这段数据的时候还原其该有的类型。
限制: 为了保持兼容性,只能添加或删除具有默认值的字段。例如,假设添加了一个带有默认值的字段,则此新字段存在于新模式中,而不是旧模式中。当使用新模式的reader读取使用旧模式写入的记录时,将为缺少的字段填充默认值。
如果要添加一个没有默认值的字段,新的reader将无法读取旧的writer写的数据,因此将破坏向后兼容性。如果要删除没有默认值的字段,旧reader将无法读取新writer写入的数据,因此将破坏向前兼容性。
数据流动模式
- 数据库数据流
- 服务调用数据流
- WEB (响应)
- REST
- SOAP
- RPC(函数)
- WEB (响应)
- 消息传递数据流