我有一个实现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
才能加载值。我不明白的是,我对另一个类具有完全相同的实现(尽管该类具有更简单的子元素)。我也不明白为什么序列化在每个课程之前都可以在每个级别上进行。