当内存中的类对象已经是二进制时,为什么要序列化(C/ c++)
Why Serialization when a class object in memory is already binary (C/C++)?
我的猜测是数据分散在物理内存中(即使类对象的数据在虚拟内存中也是顺序的),因此为了正确发送数据,需要重新组装数据,并且能够通过网络发送,另外一个步骤是将主机字节顺序转换为网络字节顺序。对吗?
适当的序列化可以用于将数据发送到任意系统,这些系统可能无法在与源主机相同的体系结构下工作。
即使是仅由本机类型组成的对象,在两个系统之间共享也会很麻烦,因为成员之间和成员之后可能存在额外的填充。在为相同架构编译但使用不同编译器版本的程序之间共享对象的原始内存转储也会变成一个很大的麻烦。不能保证变量类型T实际上是如何存储在内存中的。
如果您不使用指针(包括引用),并且数据是由与转储数据相同的二进制文件读取的,那么将原始结构体转储到磁盘通常是安全的,但是当将数据发送到另一个主机时…鼓滚序列化是前进的道路。
我听开发人员谈论过ntohl
/htonl
/ntohl
/ntohs
作为序列化/反序列化整数的方法,当你想到它说的时候,这与事实相差不远。
"序列化"这个词通常用来描述这种"以通用方式存储数据的复杂方法",但是话又说回来;在你的第一个编程任务中,你被要求将有关Dogs的信息保存到文件中(希望是*),以某种方式使用了序列化。
* "hopefully"表示您没有将Dog
对象的原始内存表示转储到磁盘
指针!
如果你在堆上分配了内存,你最终会得到一个指向任意内存区域的序列化指针。如果你只有几个ints
和chars
,那么是的,你可以直接把它写到文件中,但这就变得依赖于平台,因为你提到的字节顺序。
指针和数据包(data align)
如果你memcpy
对象的内存,复制一个野指针值而不是它的数据是很危险的。还有一个风险,如果发送方和接收方有不同的数据包(data align)方法,解码后会得到垃圾。
二进制表示在不同的体系结构、编译器甚至同一编译器的不同版本之间可能是不同的。如果没有正确定义交换数据的协议或文件格式,则不能保证系统A所看到的有符号整数在系统b上也会被视为相同。
类(当我们谈论c++时)也包括虚方法指针——它们必须在接收端重建。
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 为什么序列化指令本质上是不友好的
- 为什么非犯罪序列化添加了5个字节零前缀
- 为什么我们需要C++的对象序列化
- C++析构函数中序列化是一个坏主意,如果是,为什么
- 为什么 MPI 不提供序列化接口?
- 提升序列化库有用吗?为什么不支持"pointer to pointer"序列化?
- 为什么当对共享数据的所有引用都序列化时,函数是线程安全的
- 当内存中的类对象已经是二进制时,为什么要序列化(C/ c++)