当内存中的类对象已经是二进制时,为什么要序列化(C/ c++)

Why Serialization when a class object in memory is already binary (C/C++)?

本文关键字:序列化 为什么 c++ 二进制 内存 对象      更新时间:2023-10-16

我的猜测是数据分散在物理内存中(即使类对象的数据在虚拟内存中也是顺序的),因此为了正确发送数据,需要重新组装数据,并且能够通过网络发送,另外一个步骤是将主机字节顺序转换为网络字节顺序。对吗?

适当的序列化可以用于将数据发送到任意系统,这些系统可能无法在与源主机相同的体系结构下工作。


即使是仅由本机类型组成的对象,在两个系统之间共享也会很麻烦,因为成员之间和成员之后可能存在额外的填充。在为相同架构编译但使用不同编译器版本的程序之间共享对象的原始内存转储也会变成一个很大的麻烦。不能保证变量类型T实际上是如何存储在内存中的。


如果您不使用指针(包括引用),并且数据是由与转储数据相同的二进制文件读取的,那么将原始结构体转储到磁盘通常是安全的,但是当将数据发送到另一个主机时…鼓滚序列化是前进的道路。

我听开发人员谈论过ntohl/htonl/ntohl/ntohs作为序列化/反序列化整数的方法,当你想到它说的时候,这与事实相差不远。


"序列化"这个词通常用来描述这种"以通用方式存储数据的复杂方法",但是话又说回来;在你的第一个编程任务中,你被要求将有关Dogs的信息保存到文件中(希望是*),以某种方式使用了序列化。

* "hopefully"表示您没有将Dog对象的原始内存表示转储到磁盘

指针!

如果你在堆上分配了内存,你最终会得到一个指向任意内存区域的序列化指针。如果你只有几个intschars,那么是的,你可以直接把它写到文件中,但这就变得依赖于平台,因为你提到的字节顺序。

指针和数据包(data align)

如果你memcpy对象的内存,复制一个野指针值而不是它的数据是很危险的。还有一个风险,如果发送方和接收方有不同的数据包(data align)方法,解码后会得到垃圾。

二进制表示在不同的体系结构、编译器甚至同一编译器的不同版本之间可能是不同的。如果没有正确定义交换数据的协议或文件格式,则不能保证系统A所看到的有符号整数在系统b上也会被视为相同。

类(当我们谈论c++时)也包括虚方法指针——它们必须在接收端重建。