为什么不是每种类型的对象都可以隐式序列化?
在我有限的理解中,对象不是简单地存储在堆上而是指向堆栈上的指针吗?
你不应该以编程方式遍历它们,以通用格式存储它们并且能够从那里重建它们吗?
答案 0 :(得分:18)
某些对象封装了文件指针或网络套接字等资源,这些资源无法反序列化到序列化包含它们的对象时所处的状态。
示例:您不应该反序列化 作为经过身份验证的对象 数据库连接,因为这样做, 你需要序列化的表格 包含明文密码。这个 这不是一个好习惯,因为 有人可能会抓住被保存的人 序列化的形式。你也没有 你反序列化的想法 数据库服务器仍在运行,可以 被访问,身份验证 凭证仍然有效,等等。
答案 1 :(得分:5)
即使您只考虑不包含操作系统状态的对象,问题也比初看起来更难。图表可能有周期。可以从多个顶级实体引用实体。
我尝试outline a universal serialization library in c in a previous answer,发现有一些困难的情况。
答案 2 :(得分:3)
不,因为有时您在重建它们的地方没有所有信息。请记住,您可能无法在与您拥有它相同的上下文中重建对象;它可能是一台不同的机器甚至是不同的语言。
答案 3 :(得分:1)
序列化包含网络连接的对象并负责从Web服务器回送数据会有多大意义?
如何对其进行反序列化,它将如何工作?它应该重新打开连接,重新下载文件吗?
答案 4 :(得分:1)
在某种程度上,你的假设是正确的。
必须可以将程序中所有对象的集合划分为组
1)您拥有完整的信息,可以完全解构和重建对象。数组或字符串,结构的数组就是很好的例子。
2)您有施工信息。您可以通过调用外部代码来重建对象。文件是一个很好的例子,但它要求你的程序有一个文件抽象来记住构造和状态参数。例如,我们可以保存文件的路径和文件中的位置。但重建可能会失败。 (例如,文件已删除或更改)
3)你没有施工信息,不知何故随机收到了这个物体。
这里,为了能够完全序列化对象,我们必须从3)到2)到1)。 3)中的对象可以是类型2)的对象的属性,并且可以通过成功重建类型2)对象来检索。
然而,类型2)对象必须通过序列化构造信息来重建,构造信息必须是类型1),例如数字和字符串,真实数据。
这整个方案看起来很昂贵,因为如果我们想要重建整个程序状态,我们必须处理封装类型2的对象的抽象。当一个物体无法重建时,我们必须知道我们做了什么。此外,我们必须确保我们不混合这些类型的对象,我们不会混合类型3或2的对象,我们希望只收集类型为1的对象。
答案 5 :(得分:0)
从技术上讲,内存空间中的任何对象都可以序列化并持久保存到像硬盘一样的持久介质中。毕竟大多数操作系统页面都有活动内存进出磁盘,而且很多还具有休眠风格功能。问题是范围之一,例如:您在内存空间中创建一个字符串对象,您可以根据需要对其进行序列化和反序列化。当您打开文件时,操作系统会为您提供文件句柄,但操作系统仍然拥有包含您有句柄的实际文件对象的文件系统。另一方面,文件系统驱动程序必须维护文件句柄和其他文件相关元数据的持久数据库。