如果您有一个引用其他对象的对象实例A(例如,实例B和C),并且将A二进制序列化为文件,会发生什么?您现在是否拥有包含A,B和C的序列化数据?

它是如何工作的?反序列化数据会得到什么?A,B和C ??

(还可以包括内部工作原理说明)。

有帮助吗?

解决方案

对其他对象的所有引用也将被序列化。如果反序列化数据,最终将得到其数据的完整且有效的集合,包括对象A,B和B。 C.与XML序列化相反,这可能是二进制序列化的主要好处。

如果您的对象持有引用的任何其他类都未标记 [Serializable]属性,您将获得在运行时生成SerializationException (其图像已从网络上被无耻地窃取;在当前版本的VS中,运行时错误甚至不再像这样):

“未处理的SerializationException的示例”

此外,我不确定您希望了解哪些“内部事物”。序列化使用反射遍历对象的公共字段和私有字段,从而进行转换将它们保存为字节流,最终将字节写出为数据流。在反序列化期间,会发生相反的情况:从数据流中读取字节流,该字节流用于合成对象的精确复制以及类型信息。对象中的所有字段都具有与之前相同的值。反序列化对象时,不会调用构造函数。最简单的思考方法是,您只需获取对象的就地快照,即可随意恢复其原始状态。

负责实际序列化和反序列化的类称为格式化程序(它始终从 IFormatter接口)。它的工作是生成一个“对象图”,它是一棵包含对象的通用树,该对象被序列化/反序列化为其根。如上所述,格式化程序使用反射来遍历此对象图,对由该对象包含的所有对象引用进行序列化/反序列化。格式化程序也足够智能,可以知道不要多次序列化图形中的任何对象。如果两个对象引用实际上指向同一对象,则将检测到该对象,并且该对象仅被序列化一次。这种逻辑和其他逻辑可防止进入无限循环。

当然,对此过程的工作原理有一个很好的总体了解是很容易的。实际编写自己实现的代码要困难得多。幸运的是,这已经为您完成。 .NET Framework的部分要点是,所有这些复杂的序列化逻辑都是内置的,因此您无需担心它。我并没有声称自己了解所有内容,并且您当然也不需要充分利用它提供的功能。手写所有这些代码的多年终于结束了。您应该很高兴,而不是担心实现细节。 :-)

其他提示

首先,必须使用[Serializable]属性标记对象A的类型。序列化A将序列化其所有成员数据(私有或公开),只要成员的类型也标有[Serializable](或使用您的示例,前提是B和C的类型都标有[Serializable])。尝试直接或间接序列化非[Serializable]类型的数据将导致异常。

许多内置的.NET类型已经标记为[可序列化],包括System.Int32(int),System.Boolean(bool)等。

您可以在此处阅读有关.NET序列化的更多信息: http:// msdn。microsoft.com/en-us/library/4abbf6k0.aspx

主对象引用的对象也必须是[可序列化]。如此提供的一切都是由格式化程序自动完成的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top