C # десериализационный словарь содержит правильные ключи, но нулевые значения - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть класс, который реализует 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 необходимо вызывать в словаре для загрузки значений. Что я не понимаю, так это то, что у меня точно такая же реализация для другого класса (хотя этот класс имеет более простые дочерние элементы). Я также не понимаю, почему сериализация работает на каждом уровне до этого класса.

...