.NET二进制序列化对象并引用其他对象。会发生什么?

.NET二进制序列化对象并引用其他对象。会发生什么?,.net,binary-serialization,object-reference,object-graph,.net,Binary Serialization,Object Reference,Object Graph,如果您有一个引用其他对象(例如实例B和C)的对象实例A,并且您将A二进制序列化为一个文件,会发生什么情况?您现在是否有包含A、B和C的序列化数据 它到底是如何工作的?如果我反序列化数据,会得到什么?A、 B,和C (也可以随意加入内部工作解释)。主对象引用的对象也必须是[可序列化的]。因此,所有操作都由格式化程序自动完成。首先,必须使用[Serializable]属性标记对象A的类型。序列化A将序列化其所有成员数据(私有或公共),前提是成员的类型也标记为[Serializable](或者使用您的

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

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


(也可以随意加入内部工作解释)。

主对象引用的对象也必须是[可序列化的]。因此,所有操作都由格式化程序自动完成。

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

许多内置的.NET类型已经标记为[Serializable],包括System.Int32(int)、System.Boolean(bool)等


您可以在此处阅读有关.NET序列化的更多信息:。

对其他对象的所有引用也将被序列化。如果您对数据进行反序列化,您将得到完整的工作数据集,包括对象a、B和C。这可能是二进制序列化的主要好处,与XML序列化相反

如果您的对象持有引用的任何其他类没有标记为,您将在运行时获得一个(该类的图像被无耻地从web上窃取;在当前版本的VS中,运行时错误甚至不再是这样):

除此之外,我真的不确定你希望理解的“内在事物”是什么。序列化使用遍历对象的公共和私有字段,将它们转换为字节流,最终写入数据流。在反序列化过程中,会发生相反的情况:从数据流中读入字节流,用于合成对象的精确复制以及类型信息。对象中的所有字段都具有与之前相同的值;反序列化对象时不调用构造函数。考虑这个问题最简单的方法是,您只需拍摄一个快照来代替对象,您可以随意恢复到其原始状态

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


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

……一切都结束了。。我的问题是关于这一部分,所做的“全部”是什么?LOL@Richard:他的意思是对其他对象的所有引用也将被序列化。如果对数据进行反序列化,最终将得到一个完整的工作数据集,包括a、B和C。这可能是二进制序列化的主要好处。如果那些其他类没有标记为
[Serializable]
,您将得到一个例外。@Cody:答案加上您的注释给了我答案。谢谢虽然说实话,如果有人告诉我一些正在发生的内部事件,那就太好了。@Richard:我开始尝试用另一条评论来回答这个问题,但很快就意识到这应该是一个答案。因此,我将我之前的评论与一些关于“内部”的新信息结合起来,并发布了一个答案。希望这能为你澄清这一点。谢谢科迪,这正是我想要的。我要求了解事物内部运作的原因是,除非我理解,否则我不会真正理解和理解“啊哈”。为了得到它,我必须想象一切,并记住它。再次感谢你的回答。@Richard:当然。我明白这是怎么回事,因为我自己也是这样。我不是很想让你明白,你不应该试图去理解它。而是说“从这里开始,它变得异常复杂”,而这一点点额外的知识不值得理解来欣赏它是如何工作的。不管怎样,不客气。