pod类型可直接用std::ostream::write()内存序列化,但含std::String/vector或虚函数的类必须手动序列化字段;需校验trivially_copyable、统一字节序、用长度前缀处理字符串,并避免reinterpret_cast误用。

用 std::ostream + write() 直接写内存最简单,但只适用于 POD 类型
POD(Plain Old Data)类型——比如只有 int、double、char[32] 这类成员,没虚函数、没继承、没自定义构造/析构的 Struct/class——可以直接用 reinterpret_cast<char>(&obj)</char> 读写内存。这是最快、最轻量的方式。
常见错误现象:std::bad_cast 或读出来全是乱码,往往是因为类里混了 std::string、std::vector 或指针;这些成员不是内存连续的,直接 write() 只存了指针值,反序列化时完全失效。
实操建议:
- 先用
std::is_pod_v<t></t>或std::is_standard_layout_v<t></t>+std::is_trivially_copyable_v<t></t>静态断言确认类型安全 - 写入时用
os.write(reinterpret_cast<const char>(&obj), sizeof(obj))</const> - 读取时确保目标对象未初始化(或用 placement new),再
is.read(...)
含 std::string / std::vector 的类必须手动序列化字段
这类容器内部是堆分配的,二进制协议里不能只存指针。你得自己规定字段顺序、长度编码和边界对齐方式——这就是“自定义协议”的实质:你说了算,但每一步都得亲手控制。
立即学习“C++免费学习笔记(深入)”;
使用场景:网络传输、本地缓存、跨进程共享数据。重点不是“能不能”,而是“字段怎么排、字符串怎么定长/变长、要不要校验”。
实操建议:
- 字符串优先用“长度前缀 + 字节流”:先写
uint32_t len,再写data.data()的len字节 - 避免直接写
std::string::c_str(),它不保证结尾有