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