直接利用基本数据类型固有的字节宽度和内存布局可实现紧凑、确定、零开销序列化:使用int32_t等固定宽度类型锚定字节边界,字段顺序即协议布局,不加元信息,显式处理字节序,字符串采用“长度+内容”双段式格式。

直接利用基本数据类型固有的字节宽度和内存布局,就能写出紧凑、确定、零开销的序列化协议。关键不是堆砌功能,而是信任整数、字符、浮点数这些类型在内存中“长什么样”,并让协议完全贴合它。
用固定宽度类型锚定字节边界
避免使用 int、long 这类平台相关类型。改用 int32_t、uint16_t、int8_t 等精确宽度类型——它们在所有主流平台上都占固定字节数,不会因编译器或系统而变。
- int32_t x = 12345 → 永远占 4 字节,小端序下存为 [0x39, 0x30, 0x00, 0x00]
- uint16_t port = 8080 → 永远占 2 字节,大端序下存为 [0x1F, 0x90]
- int8_t op = '+' → 永远占 1 字节,就是 0x2B
字段顺序即协议布局,不加额外元信息
不插入长度前缀、类型标识、分隔符。把结构体字段按顺序一字排开,就是最终字节流。例如:
struct Request {
int32_t id;
uint16_t code;
int8_t flag;
};
// 对应字节布局:[id:4][code:2][flag:1] → 共 7 字节
序列化时直接 memcpy 或逐字节写入;反序列化时按相同偏移读取。没有冗余,没有解释成本。
显式处理字节序,不依赖平台默认
网络通信或跨平台存储必须统一字节序。小端设备发给大端设备前,要主动转换:
- 发送前:用 htons()(host to network short)、htonl() 把整数转为大端(网络字节序)
- 接收后:用 ntohs()、ntohl() 转回主机序
- 若全程控制两端(如嵌入式节点间),可约定全用小端,省去转换,但需文档明确标注
字符串与变长数据用长度+内容双段式
字符串不能像 C 风格那样靠 '\0' 截断——那会破坏紧凑性且不安全。统一采用“4 字节长度 + 原始字节”格式:
- 字符串 "hello" → 先写 0x00000005(int32_t len),再写 [0x68,0x65,0x6C,0x6C,0x6F]
- 二进制 blob 同理,长度字段确保接收方知道该读多少字节,不依赖内容特征
- 长度本身也用固定宽度类型(如 int32_t),保持整体可预测










