我们应该序列化 std::chrono::d uration 类还是 P.O.D.(普通旧数据)并且不需要序列化
Should we serialize std::chrono::duration class or is it P.O.D. (Plain Old Data) and no serialization is needed?
我和我的朋友在C++中争论P.O.D类型。整个大惊小怪是关于我们是否应该序列化下面的结构。如果结构不是 P.O.D.(计划旧数据),我们应该序列化。
他说,如果官方标准没有说明,那么std::chrono::d uration必须是P.O.D.而不是由实现决定的,当我们总是序列化它时,我们会更安全。
但是,我写了一个小代码要点,证明它是微不足道的,具有标准布局,因此是 P.O.D。
#include <iostream>
#include <chrono>
struct myStruct
{
std::chrono::seconds timeSec;
};
int main () {
std::cout << std::boolalpha << "is_pod<std::chrono::seconds> = "
<< std::is_pod<std::chrono::seconds>() << std::endl
<< "is_pod<myStruct> = " << std::is_pod<myStruct>() << std::endl;
std::cout << std::boolalpha << "is_trivial<std::chrono::seconds> = "
<< std::is_trivial<std::chrono::seconds>() << std::endl
<< "is_is_standard_layout<std::chrono::seconds> = "
<< std::is_standard_layout<std::chrono::seconds>() << std::endl;
std::cout << std::boolalpha << "is_trivial<myStruct> = "
<< std::is_trivial<myStruct>() << std::endl
<< "is_is_standard_layout<myStruct> = "
<< std::is_standard_layout<myStruct>() << std::endl;
}
你的代码只"证明"一件事:你运行它的实现实现了duration
这样它是微不足道的可复制和标准布局。标准中没有任何内容要求这样做,因此任何其他实现(包括同一库的更高版本)都可以自由更改规则。
现在,您可以做一些if constexpr
/enable_if
或类似的体操,这样,如果实现提供了微不足道的可复制性,则可以使用该能力而不是"序列化"它。但是你不能假设情况总是如此(除非你在一个你知道你将永远使用特定库的环境中工作);您只能在可用的情况下利用它。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 如何知道QDataStream不能反序列化某些内容
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 每次进行继承时都需要提升::序列化::base_object吗?
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 为什么 pair 在初始化中不需要类型
- 我们是否需要序列化 VAO 和 VBO
- 为什么在这种特殊情况下不需要将 std::hash() 的专用化注入到 std 命名空间中?
- 我们应该序列化 std::chrono::d uration 类还是 P.O.D.(普通旧数据)并且不需要序列化
- 使用 fwrite/fread 对矩阵进行二进制(反)序列化不起作用
- 端口项目 VS2003 -> VS2013 错误 C2039 序列化不是hash_Map的成员
- xml序列化不同于以字符串形式发送的原因
- 派生对象的提升序列化不调用派生对象的序列化()
- 为什么通过内联函数的初始化不需要静态地完成
- boost::chrono::时间点类型的序列化不起作用
- std::list类型可变变量的boost序列化不起作用
- 嵌套结构的boost序列化不起作用
- 对象的序列化:不能涉及线程状态,对吧