2010-03-08 24 views
9

我有一个Bar类,它包含一个List<Foo>FooBar都实现了ISerializable。反序列化包含列表的类<T>:为什么List最初填充了空值?

当反序列化Bar时,List<Foo>最初被填充(正确数量)null s;然后在退出Bar反序列化的过程中,调用每个Foo的反序列化命令,用(正确反序列化的)Foo填充List<Foo>

这是怎么发生的?我无法在一个测试项目中复制它:无论我尝试过什么,导致Foo反序列化过程在之前被称为Bar ctor。这实际上是我想要的行为,因为我需要填充列表以便为反序列化的Bar进行一些初始化!

任何人都有一个想法,以至于可能导致Foo这么晚才被反序列化?谢谢!

+2

顺便说一下,我已经能够在反序列化之后但在返回之前使用[OnDeserializedAttribute]的方法进行所需的初始化(请参阅http://msdn.microsoft.com/zh-cn/library/system.runtime。 serialization.ondeserializedattribute%28v = VS.90%29.aspx)。 – 2010-03-08 12:44:26

+1

参见http://stackoverflow.com/questions/1097797/custom-net-serialization-doesnt-seem-to-work;尽管没有更好的答案。 – 2010-03-08 13:41:51

回答

5

这是逻辑。反序列化器按对象对它进行反序列化,然后依次引用。所以,首先它用X空格设置列表......实际上它们都是NULL。

然后它进入并反序列化对象,将它们放入适当的引用中。

所有检查等逻辑从你应该只运行后反序列化已完成 - 根据定义,你必须始终有部分/无效状态,而解串器运行。

问题出现的原因为时已晚,您的测试场景比真实数据要容易得多,所以有些东西使得序列化程序在生产端“转向订单”。

+0

这对我来说没有意义。序列化程序一次只检查一个对象,在这种情况下,测试用例的行为也会像Bar一样,或者它正在查看对象图并从底部开始,在这种情况下,Bar应以不同的方式工作。 – 2010-03-08 11:36:43

+1

在任何情况下,它都不会达到我期望的效果,这是以Bar开头的;那么当它到达Foos列表时,反序列化每个Foo;然后继续与酒吧。 – 2010-03-08 11:38:24

相关问题