为什么我们需要C ++中的对象序列化?

时间:2016-04-22 10:10:28

标签: c++ c++11 serialization

如果我们想要保留该对象或通过网络传输,或者仅在特殊情况下,我们是否总是需要在c ++中序列化对象。

例如,如果我有一个类的对象

class Test
{
int a;
char b;
float c;
};

即。它只包含原始类型,我需要序列化吗?

3 个答案:

答案 0 :(得分:1)

取决于你对持久/传输对象的处理方式。

在某些特殊情况下,当您只在相同或相同的机器上使用相同版本的程序回读对象时,您可以简单地将对象一点一点地复制到字符流中。

但总的来说是的,你确实需要序列化。如果使用不同的选项构建,则类可能具有不同的填充量,使得二进制格式在它们之间不兼容。不同的CPU架构具有不同的字节序,并且必须在它们之间转换intfloat等多字节值。

答案 1 :(得分:0)

是的,您需要序列化。从A发送信息到B时,它总是转换为bytearray。 B方需要知道如何"反序列化" bytearray。

答案 2 :(得分:0)

取决于对象的类型和主机的类型。

该对象应该是可以轻易复制的(请参阅std::is_trivially_copyable)。这些对象不能有非平凡的复制/移动构造函数或非平凡的赋值运算符,它们需要一个简单的析构函数。例如,所有标量类型和标量类型的结构都可以轻易地复制。 std :: string不是。

应用程序的两个实例都必须对结构使用相同的打包对齐(例如,请参阅#pragma pack)。

网络主机必须使用相同的字节顺序。如果一个主机使用Big-endian而另一个使用Little-endian,则可以在没有特别注意的情况下传输的最大信息单位是一个字节(例如uint8_t)。即使是一个简单的int也不能在两台具有不同endianess的机器之间移动(一台机器的0x11223344为另一台机器的0x44332211)