我的猜测是数据分散在物理内存中(即使类对象的数据在虚拟内存中是连续的),因此为了正确地发送数据,需要重新组装数据,并且为了能够通过网络发送,还需要将主机字节顺序转换为网络字节顺序。这样理解是否正确?
我的猜测是数据分散在物理内存中(即使类对象的数据在虚拟内存中是连续的),因此为了正确地发送数据,需要重新组装数据,并且为了能够通过网络发送,还需要将主机字节顺序转换为网络字节顺序。这样理解是否正确?
指针!
如果你在堆上分配了内存,你最终会得到一个指向任意内存区域的序列化指针。如果你只有一些int
和char
,那么可以直接将它们写入文件,但这样就会因为字节顺序问题而依赖于平台。
指针和数据包(数据对齐)
如果您使用memcpy
函数复制对象的内存,可能会复制一个野指针而非数据。还有另一种风险,如果发送方和接收方使用不同的数据包(数据对齐)方法,则在解码后可能会得到垃圾值。
二进制表示法在不同的架构、编译器甚至是同一编译器的不同版本之间可能会有所不同。不能保证系统A所看到的有符号整数在系统B上也能被视为相同的值。如果您没有正确定义协议或文件格式来交换数据,字节顺序、字长、结构填充等问题将变得难以调试。
当我们谈论C++时,类(Class)也包括虚方法指针 - 它们必须在接收端重建。
sizeof
中,从缓冲区中进行 memcpy 会破坏它,因此必须逐个序列化/反序列化成员(总是可以有一个大的 POD 成员或实际数据的基类)。 - Jan Hudec