【问题标题】:Deserializing a class containing a List<T>: Why is List initially filled with Nulls?反序列化包含 List<T> 的类:为什么 List 最初充满 Null?
【发布时间】:2011-01-24 22:35:13
【问题描述】:

我有一个类Bar,其中包含一个List&lt;Foo&gt;FooBar 都实现了ISerializable。

在反序列化Bar 时,List&lt;Foo&gt; 最初填充(正确数量的)nulls;然后在退出Bar 反序列化ctor 时,会调用每个Foo 的反序列化ctor,用(正确反序列化的)Foos 填充List&lt;Foo&gt;

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

任何人都知道是什么导致Foos 这么晚才反序列化?谢谢!

【问题讨论】:

标签: c# list serialization


【解决方案1】:

这是逻辑。反序列化器逐个对象反序列化它,然后跟随引用。所以,首先它用 X 个空格设置列表……实际上都是 NULL。

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

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

事情做得太晚的问题可能是你的测试场景比真实数据容易得多,所以有些东西让序列化程序在生产端“改变订单”。

【讨论】:

  • 这对我来说没有意义。序列化程序一次遍历一个对象,在这种情况下,测试用例的行为也类似于 Bar,或者它正在查看对象图并从底部开始,在这种情况下,Bar 应该以不同的方式工作。
  • 在这两种情况下,它都没有达到我的预期,即从 Bar 开始;然后当它到达 Foos 列表时,反序列化每个 Foo;然后继续使用 Bar。
猜你喜欢
  • 2011-09-09
  • 2012-08-23
  • 1970-01-01
  • 2012-09-09
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
相关资源
最近更新 更多