我有一个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
必须要求它才能工作吗?
为了完整起见,这是为了运行应用程序的实例之间的持久性,不需要该文件可被其他程序或其他平台读取。
答案 0 :(得分:6)
将对象的按位图像写入流并通过读取该流正确地恢复它与在memcpy
下正确行为的对象完全相同。为此,开始具有可复制性的特定属性。因此,您要使用的特征是std::is_trivially_copyable<A>
。
无关的旁注:您的代码理论上可能具有未定义的行为。这是因为C ++只允许通过char
和unsigned char
类型进行别名,并且不能保证std::uint8_t
是其中之一的别名。您最好明确使用unsigned char
:
write(fd, reinterpret_cast<unsigned char*>(&a), sizeof(a));
答案 1 :(得分:3)
根据agnew的回答,您要找的是is_trivially_copyable
。但是,由于
此外,您将遇到版本控制问题,并且数据的含义在不同的执行机器上可能会有所不同。
这就是为什么我建议引入自定义特征is_doron_serializabe
,并将其默认设置为false
以用于未明确标记为兼容的类型。
(在某些情况下,您计划的可能可以。)