C#反序列化字典包含正确的键,但值为空

时间:2018-09-18 01:59:36

标签: c# serialization deserialization

我有一个实现ISerializable并存储包含对象的Dictionary的类。这些对象具有多个级别的子对象,这些子对象还包含集合以及所有其他可序列化的其他字段。

在单元测试中,测试底层的子对象时,所有的序列化和反序列化都很好,但是在这个最外层的类中,当我反序列化包含所有子元素(及其所有子元素的Dictionary时) ),则密钥会正确加载,但与密钥相关联的所有值均为null

这是最外面的类的外观:

[Serializable]
internal class ChildCollection : ISerializable
{
  private readonly Dictionary<ulong, ChildElement> _children;

  protected ChildCollection( SerializationInfo info, StreamingContext context )
  {
    _childElements = new Dictionary<ulong, ChildElement>();

    var children = ( Dictionary<ulong, ChildElement> )info.GetValue( nameof( _children ), typeof( Dictionary<ulong, ChildElement> ) );
    children.OnDeserialization( null );

    foreach( var child in children.Values )
      Add( child ); // This throws an exception, as all values are null
  }

  public virtual void GetObjectData( SerializationInfo info, StreamingContext context )
  {
    info.AddValue( nameof( _children ), _children );
  }
}

我了解C#序列化在实现方式上非常混乱,并且需要在字典上调用OnDeserialization才能加载值。我不明白的是,我对另一个类具有完全相同的实现(尽管该类具有更简单的子元素)。我也不明白为什么序列化在每个课程之前都可以在每个级别上进行。

0 个答案:

没有答案