字典上.NET二进制序列化的奇怪行为

我在.NET的二进制序列化中遇到了一个奇怪的行为,至少在我的期望中。

加载的Dictionary所有项目都将在OnDeserialization回调后添加到其父项。 相反, List则采用另一种方式。 这在真实世界的存储库代码中可能非常烦人,例如,当您需要向字典项添加一些委托时。 请检查示例代码并观察断言。

这是正常的行为吗?

 [Serializable] public class Data : IDeserializationCallback { public List List { get; set; } public Dictionary Dictionary { get; set; } public Data() { Dictionary = new Dictionary { { "hello", "hello" }, { "CU", "CU" } }; List = new List { "hello", "CU" }; } public static Data Load(string filename) { using (Stream stream = File.OpenRead(filename)) { Data result = (Data)new BinaryFormatter().Deserialize(stream); TestsLengthsOfDataStructures(result); return result; } } public void Save(string fileName) { using (Stream stream = File.Create(fileName)) { new BinaryFormatter().Serialize(stream, this); } } public void OnDeserialization(object sender) { TestsLengthsOfDataStructures(this); } private static void TestsLengthsOfDataStructures(Data data) { Debug.Assert(data.List.Count == 2, "List"); Debug.Assert(data.Dictionary.Count == 2, "Dictionary"); } } 

我可以重现这个问题。 看看谷歌并找到了这个: http : //connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=94265虽然我不确定它是完全相同的问题,但它看起来非常相似。

编辑:

我认为添加此代码可能已经解决了问题?

  public void OnDeserialization(object sender) { this.Dictionary.OnDeserialization(sender); } 

没有时间进行详尽的测试,我想要击败Marc的答案;-)

是的,你在Dictionary反序列化中发现了一个烦人的怪癖。 您可以通过手动调用字典的OnDeserialization()方法来解决它:

 public void OnDeserialization(object sender) { Dictionary.OnDeserialization(this); TestsLengthsOfDataStructures(this); } 

顺便提一下,您也可以使用[OnDeserialized]属性而不是IDeserializationCallback

 [OnDeserialized] public void OnDeserialization(StreamingContext context) { Dictionary.OnDeserialization(this); TestsLengthsOfDataStructures(this); } 

有趣…有关信息,我尝试使用基于属性的方法(下面),它的行为相同……非常好奇! 我无法解释它 – 我只是回复确认转载,并提到[OnDeserialized]行为:

 [OnDeserialized] // note still not added yet... private void OnDeserialized(StreamingContext context) {...} 

编辑 – 在这里找到“连接”问题。 尝试添加回调:

 Dictionary.OnDeserialization(this);