2009-08-21 40 views
10

为什么不是每种类型的对象都可以隐式序列化?为什么不是每种类型的对象都可序列化?

在我有限的理解中,对象不是简单地存储在堆上,而是指向堆栈上的指针?

您不应该能够以编程方式遍历它们,将它们存储为通用格式,并且能够从那里重建它们?

+0

什么语言,框架? – 2009-08-21 01:31:41

+1

我只是在问一般.. :-) – Matt 2009-08-21 01:36:29

回答

18

某些对象封装资源,如文件指针或网络套接字,这些资源不能被反序列化为,而是将序列化包含它们的对象时所处的状态。

举例:你不应该反序列化 对象,充当身份验证 数据库连接,因为这样做, 你需要的序列化形式 包含明文密码。这个 将不是一个好的做法,因为 某人可能会保留已保存的 序列化表单。您还没有 的想法,当你反序列化的 数据库服务器仍在运行,可以 访问,认证证书 仍然有效等

3

没有,因为有时你不具备的所有信息在你重建它们的地方。请记住,您可能不会在与您拥有的环境相同的环境中重建该对象;它可能是一个不同的机器,甚至不同的语言。

5

即使您只考虑不包含OS状态的对象,问题也比乍看起来要困难。图表可能有周期。实体可能来自多个顶级实体。

我试图outline a universal serialization library in c in a previous answer,发现有一些困难的情况。

+0

对,可以有周期等,但这些都是解决的问题。与序列化窗口句柄或文件句柄的无意义相反。 – 2009-08-21 01:37:26

+0

@Steven Sudit:我会将它们描述为“已知可解决”而非“已解决”。有必须作出的决定:在现在序列化的程度和后来的反序列化结构的相同程度之间进行权衡。不同的问题可能需要不同的选择。所以这些问题有解决方案,但没有单一的解决方案将适用于所有情况。这就是问题所在。 – dmckee 2009-08-21 02:04:05

+0

问题很难,但其他人已经为我们解决了。例如,在.NET中,有一个完美可行的序列化系统,可以顺利处理循环。其他平台也有类似的解决方案。然而,他们没有一个能做的就是序列化像手柄这样的东西。这是一个更深层次的问题。 – 2009-08-21 04:13:06

0

从技术上讲,内存空间中的任何对象都可以被序列化并持久保存到硬盘等持久性介质中。毕竟,大多数操作系统都会将活动内存分页到磁盘,并且还有许多还具有休眠风格功能。问题是一个范围,例如:你在你的内存空间中创建一个字符串对象,你的序列化和反序列化,你认为合适。当你打开一个文件时,操作系统给你一个文件句柄,但是操作系统仍然拥有包含你有句柄的实际文件对象的文件系统。另一方面,文件系统驱动程序必须维护文件句柄和其他文件相关元数据的持久数据库。

1

它将序列化一个包含网络连接的对象并负责从Web服务器返回数据流的意义是多少?

如何反序列化它,这将如何工作?是否应该重新打开连接,重新下载文件?

1

在某种程度上,你的假设是正确的。

它必须能够设定在程序中的所有对象的划分成组

1)你有完整的信息,其允许完全解构和所述对象的重建。数字或字符串的数组,结构是很好的例子。

2)您有施工信息。您可以通过调用外部代码来重建对象。一个文件就是一个很好的例子,但它要求你的程序有一个文件抽象来记住构造和状态参数。我们可以例如保存文件的路径和文件中的位置。但重建可能会失败。 (例如,该文件被删除或更改)

3)您没有施工信息,该对象以某种方式随机接收。

在这里,为了能够完全序列化对象,我们必须从3)到2)到1)。 3)中的对象可以是类型2)的对象的属性,并且可以通过成功重建类型2)对象来检索。

然而,类型2)的对象必须通过序列化仅仅必须是类型1的构造信息来重构,例如数字和字符串,真实数据。

这整个方案看起来很昂贵,因为如果我们想重建整个程序状态,我们必须使用封装类型2的对象的抽象。我们必须知道当一个物体不能被重建时我们做了什么。此外,我们必须确保我们不混合这些类型的对象,我们不混合类型3或2的对象,我们期望收集类型1的对象。

相关问题