Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 为什么不是';不是每种类型的对象都可以序列化吗?_Language Agnostic_Serialization - Fatal编程技术网

Language agnostic 为什么不是';不是每种类型的对象都可以序列化吗?

Language agnostic 为什么不是';不是每种类型的对象都可以序列化吗?,language-agnostic,serialization,Language Agnostic,Serialization,为什么不是每种类型的对象都可以隐式序列化 在我有限的理解中,对象不是简单地存储在堆上并在堆栈上指向它们的指针吗 难道你不应该以编程方式遍历它们,以通用格式存储它们,并从那里重建它们吗?有些对象封装了资源,如文件指针或网络套接字,它们无法反序列化为包含它们的对象序列化时的状态 示例:不应反序列化 对象,该对象用作经过身份验证的 数据库连接,因为要这样做, 您需要序列化的表单来 包含明文密码。这 这不是一个好的做法,因为 有人可能会找到被救的人 序列化形式。你也没有 当您反序列化 数据库服务器仍在运

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

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


难道你不应该以编程方式遍历它们,以通用格式存储它们,并从那里重建它们吗?

有些对象封装了资源,如文件指针或网络套接字,它们无法反序列化为包含它们的对象序列化时的状态

示例:不应反序列化 对象,该对象用作经过身份验证的 数据库连接,因为要这样做, 您需要序列化的表单来 包含明文密码。这 这不是一个好的做法,因为 有人可能会找到被救的人 序列化形式。你也没有 当您反序列化 数据库服务器仍在运行,可以吗 被访问时,身份验证 凭证仍然有效等


不,因为有时候你在重建它们的地方没有所有的信息。请记住,您可能不会在与您拥有该对象的位置相同的上下文中重建该对象;它可能是不同的机器,甚至不同的语言。

即使你只考虑不包括OS状态的对象,问题也比乍看起来更难。图表可能有循环。可以从多个顶级实体引用实体


我试过了,发现有一些硬壳。

从技术上讲,内存空间中的任何对象都可以序列化并持久保存到硬盘之类的持久介质中。毕竟,大多数操作系统都将活动内存分页到磁盘或从磁盘分页,而且许多操作系统还具有hibernate风格的功能。问题在于作用域,例如:您在内存空间中创建了一个字符串对象,您可以根据需要对其进行序列化和反序列化。当您打开一个文件时,操作系统会给您一个文件句柄,但操作系统仍然拥有包含您有句柄的实际文件对象的文件系统。另一方面,文件系统驱动程序必须维护文件句柄和其他文件相关元数据的持久数据库。

序列化包含网络连接并负责从web服务器返回数据流的对象有多大意义


反序列化如何,如何工作?如果它重新打开连接,请重新下载文件?

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

必须能够将程序中的所有对象集划分为多个组

1) 您拥有完整的信息,可以完全解构和重建对象。数字或字符串数组、结构就是很好的例子

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

3) 您没有构造信息,该对象是以某种方式随机接收的

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

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


整个方案似乎代价高昂,因为如果我们想要重建整个程序状态,我们必须使用封装类型2)的对象的抽象。我们必须知道当一个物体不能被重建时我们会做什么。此外,我们必须确保我们不会混合这些类型的对象,也不会混合类型3或2的对象,因为我们希望只收集类型1的对象。

我只是在一般情况下问…-)对,可以有循环等等,但这些都是解决了的问题。与序列化窗口句柄或文件句柄的意义相比,这是毫无意义的。@Steven Sudit:我认为它们是“已知可解决的”,而不是“已解决的”。必须做出一些决定:在您现在序列化的程度和反序列化结构以后的相同程度之间进行权衡。不同的问题可能需要不同的选择。因此,问题有解决方案,但没有一个单一的解决方案可以解决所有情况。这就是问题的症结所在。问题很难解决,但其他人已经为我们解决了。例如,在.NET中,有一个完全可行的序列化系统,可以毫无障碍地处理循环。在其他平台上也有类似的解决方案。然而,它们中没有一个能做的是序列化句柄之类的东西。这是一个更深层次的问题。@Steven Sudit:你可能没有领会我的意思。在构造通用序列化程序时需要进行权衡。NET用户或根用户创建了它们,这很好。但如果我的情况需要一套不同的权衡呢?问题总是可以解决的,但没有一个解决方案总是适用的。@Dmcke:我想我们可能是在扯淡,而不是不同意。。我不否认一般序列化存在问题和复杂性。我的观点是,无论在原则上还是在实践中,这些问题都是可以解决的,或者至少是可以解决的。另一方面,有些资源类型的序列化对于它们来说毫无意义,而且这种情况永远不会改变。我们将永远无法在互斥句柄上使用Hibernate或XmlSerializer或其他任何东西,因为当互斥对象消失时,它的值是毫无意义的。