Dictionary <Key,Value>上.NET二进制序列化的奇怪行为如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

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

Dictionary加载的所有项目都会在OnDeserialization回调后添加到其父级。与此相反的List是另一种方式。这在真实世界的仓库代码中可能非常恼人,例如,当您需要将一些代表添加到词典项目时。请检查示例代码并观看断言。

这是正常的行为吗?

[Serializable]
public class Data : IDeserializationCallback
{
    public List<string> List { get; set; }

    public Dictionary<string, string> Dictionary { get; set; }

    public Data()
    {
        Dictionary = new Dictionary<string, string> { { "hello", "hello" }, { "CU", "CU" } };
        List = new List<string> { "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);
    }
用户回答回答于

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

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

顺便说一句,你也可以使用[OnDeserialized]属性而不是IDeserializationCallback

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

扫码关注云+社区