如果我们想要保留该对象或通过网络传输,或者仅在特殊情况下,我们是否总是需要在c ++中序列化对象。
例如,如果我有一个类的对象
class Test
{
int a;
char b;
float c;
};
即。它只包含原始类型,我需要序列化吗?
答案 0 :(得分:1)
取决于你对持久/传输对象的处理方式。
在某些特殊情况下,当您只在相同或相同的机器上使用相同版本的程序回读对象时,您可以简单地将对象一点一点地复制到字符流中。
但总的来说是的,你确实需要序列化。如果使用不同的选项构建,则类可能具有不同的填充量,使得二进制格式在它们之间不兼容。不同的CPU架构具有不同的字节序,并且必须在它们之间转换int
和float
等多字节值。
答案 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)