键入简单可序列化C ++类的特征

时间:2016-08-15 10:17:58

标签: c++ serialization

我有一个C ++类定义为A a;我想序列化。最简单的方法(当它工作时)是

write(fd, reinterpret_cast<uint8_t*>(&a), sizeof(a));

并使用以下方式阅读:

read(fd, reinterpret_cast<uint8_t*>(&a), sizeof(a));

我知道如果std::is_pod<A>::value是真正的类型,这将有效但是最轻松的类型特征集A必须要求它才能工作吗?

为了完整起见,这是为了运行应用程序的实例之间的持久性,不需要该文件可被其他程序或其他平台读取。

2 个答案:

答案 0 :(得分:6)

将对象的按位图像写入流并通过读取该流正确地恢复它与在memcpy下正确行为的对象完全相同。为此,开始具有可复制性的特定属性。因此,您要使用的特征是std::is_trivially_copyable<A>

无关的旁注:您的代码理论上可能具有未定义的行为。这是因为C ++只允许通过charunsigned char类型进行别名,并且不能保证std::uint8_t是其中之一的别名。您最好明确使用unsigned char

write(fd, reinterpret_cast<unsigned char*>(&a), sizeof(a));

答案 1 :(得分:3)

根据agnew的回答,您要找的是is_trivially_copyable。但是,由于

,thjis并不意味着可序列化的
  • 不同编译器/编译选项上的不同数据类型大小
  • 不同编译器/平台/编译选项的不同对齐
  • 不同平台上的字节顺序

此外,您遇到版本控制问题,并且数据的含义在不同的执行机器上可能会有所不同。

这就是为什么我建议引入自定义特征is_doron_serializabe,并将其默认设置为false以用于未明确标记为兼容的类型。

(在某些情况下,您计划的可能可以。)