如果您有一个引用其他对象(例如实例 B 和 C)的对象实例 A,并且您将 A 二进制序列化到文件中,会发生什么情况?您现在有包含 A、B 和 C 的序列化数据吗?
它到底是如何运作的?如果我反序列化数据会得到什么?甲、乙、丙??
(也请随意包含内部工作原理解释)。
对其他对象的所有引用也将被序列化。如果反序列化数据,您最终将得到一个完整的、可工作的数据集,包括对象 A、B 和 C。这可能是二进制序列化相对于 XML 序列化的主要好处。
如果您的对象持有的任何其他类没有标记为[Serializable]属性,你会得到一个SerializationException在运行时(其图像是无耻地从网络上窃取的;在当前版本的 VS 中,运行时错误甚至不再像这样了):
除此之外,我不太确定您希望了解什么“内部事物”。序列化用途反射遍历对象的公共和私有字段,将它们转换为字节流,最终写入数据流。在反序列化期间,会发生相反的情况:从数据流中读入字节流,该字节流用于合成对象的精确副本以及类型信息。对象中的所有字段都具有与之前相同的值;构造函数是not当对象被反序列化时调用。最简单的思考方法是,您只需采取就地快照的物体,你可以随意恢复到原来的状态。
负责实际序列化和反序列化的类称为格式化程序(它总是继承自IFormatter界面)。它的工作是生成一个“对象图”,它是一个广义树,其中包含正在序列化/反序列化的对象作为其根。如上所述,格式化程序使用反射来遍历该对象图,序列化/反序列化该对象包含的所有对象引用。格式化程序也足够智能,知道不要多次序列化图中的任何对象。如果两个对象引用实际上指向同一个对象,则会检测到这一点,并且该对象只会被序列化一次。这个逻辑和其他逻辑可以防止进入无限循环。
当然,很容易对这个过程的工作原理有一个很好的总体了解。它是much自己实际编写实现它的代码更困难。幸运的是,这已经为您完成了。 .NET Framework 的部分优点是所有这些复杂的序列化逻辑都是内置的,让您无需担心。我并不声称自己了解所有内容,而且您当然也不需要了解它即可充分利用它提供的功能。多年手工编写所有代码的经历终于结束了。您应该感到高兴,而不是担心实现细节。 :-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)