.NET Binary Serialize对象,引用其他对象...怎么了?

ric*_*ard 3 .net object-reference binary-serialization object-graph

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

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

(随意包括内部工作原理解释).

Cod*_*ray 8

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

如果您的对象持有引用的任何其他类没有使用该[Serializable]属性标记,您将获得一个SerializationException运行时(其图像从Web无耻地被盗;运行时错误甚至看起来不像这在VS的当前版本中已经存在了:

    未处理的SerializationException的示例

除此之外,我不太确定你希望了解的"内部事物".序列化使用反射来遍历对象的公共和私有字段,将它们转换为字节流,最终写入数据流.在反序列化期间,反向发生:从数据流中读入字节流,用于合成对象的精确复制以及类型信息.对象中的所有字段都具有与之前相同的值; 反序列化对象时调用构造函数.考虑它的最简单方法是,您只是对对象进行快照就位,您可以随意恢复到其原始状态.

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

当然,很容易对这个过程的工作原理有一个很好的了解.这是难实际编写实现它自己的代码.幸运的是,这已经为你完成了..NET Framework的部分重点是内置所有这些复杂的序列化逻辑,让您免于担心.我并不声称自己理解所有这些,你当然也不需要充分利用它提供的功能.多年来手工编写所有代码终于结束了.你应该欢欣鼓舞,而不是担心实施细节.:-)