反序列化包含List<T>的类:为什么List最初被填充为Null?

10

我有一个类Bar,其中包含一个List<Foo>,同时FooBar都实现了ISerializable接口。

当反序列化一个Bar对象时,List<Foo>最初被填充了(正确数量的)null,然后在退出Bar反序列化的构造函数时,每个Foo的反序列化构造函数会被调用,将List<Foo>填充为(正确反序列化的)Foo

这是为什么呢?我无法在测试项目中复制这种情况:无论我尝试什么,Foo的反序列化构造函数都会在Bar构造函数之前被调用。实际上,这正是我想要的行为,因为我需要按顺序填充列表以对反序列化的Bar进行一些初始化操作!

有人知道是什么原因导致Foo反序列化如此晚吗?谢谢!


2
顺便提一下,我已经能够在反序列化后但返回之前使用带有[OnDeserializedAttribute]方法进行所需的初始化(请参见http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializedattribute%28v=VS.90%29.aspx)。 - Joel in Gö
1
请参见http://stackoverflow.com/questions/1097797/custom-net-serialization-doesnt-seem-to-work;尽管那里没有更好的答案。 - Joel in Gö
1个回答

6

这是逻辑。反序列化程序按对象和引用的顺序对其进行反序列化。因此,它首先设置了具有X个空间的列表...实际上所有空间都为NULL。

然后,它逐个对象地进行反序列化,并将它们放入正确的引用中。

所有的检查等逻辑都应该在反序列化完成后运行 - 根据定义,在反序列化运行时必须始终存在部分/无效状态。

之所以事情被那么晚做,可能是因为你的测试场景比真实数据要简单得多,因此某些东西使得序列化程序在生产方面“改变顺序”。


这对我来说没有意义。要么序列化程序逐个处理对象,那么测试用例的行为也应该像Bar一样,要么它正在查看对象图并从底部开始,那么Bar的工作方式应该不同。 - Joel in Gö
1
在这两种情况下,它都没有按照我的预期执行,即从Bar开始;然后当它到达Foo列表时,反序列化每个Foo;然后继续进行Bar。 - Joel in Gö

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接