将类型序列化为Dictionary

时间:2012-02-15 17:20:02

标签: c# serialization .net-2.0 deserialization binaryformatter

我正在尝试将Dictionary<int, int>序列化为Dictionary<string, string>

所以我从Test2创建了Dictionary<int, int>类型,如下所示:

    [Serializable]
    internal sealed class Test2 : Dictionary<int, int>
    {
        internal Test2()
        {
        }

        private Test2(SerializationInfo info, StreamingContext context)
        {
            var data = (Dictionary<string, string>)
                       info.GetValue("data", typeof(Dictionary<string, string>));
            foreach (var item in data)
                Add(int.Parse(item.Key), int.Parse(item.Value));
        }

        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            var data = new Dictionary<string, string>();
            foreach (var item in this)
                data[item.Key.ToString()] = item.Value.ToString();
            info.AddValue("data", data, typeof(Dictionary<string, string>));
        }
    }

并使用以下代码测试序列化:

        var test2 = new Test2 {{10, 10}};
        var formatter = new BinaryFormatter();
        using (var stream = new MemoryStream())
        {
            formatter.Serialize(stream, test2);
            stream.Position = 0;
            var clone = (Test2) formatter.Deserialize(stream);
        }

由于某种原因,克隆不包含任何数据(将eq计为0)。

更新

“int”和“string”仅用于测试。在实际的应用程序中,我使用的是主键而不是字符串和大对象而不是int,序列化数组包含它们之间的关系。通过减少不相关的代码并用上面的例子替换我最终的类型。

我只能使用.NET框架功能。

1 个答案:

答案 0 :(得分:0)

您无需在序列化期间将整数转换为字符串或定义您自己的可序列化类 - 框架会为您处理。此代码(从this question修改)将完成您想要的任务:

var test2 = new Dictionary<int, int> { { 10, 10 } } ;
var formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
    formatter.Serialize(stream, test2);
    stream.Position = 0;
    var clone = (Dictionary<int, int>) formatter.Deserialize(stream);
}

我不确定为什么你的原始代码不起作用,但我认为它与SerializationInfo集合无法正确序列化/反序列化字典有关。我使用List<Tuple<string,string>>代替Dictionary<string,string>的代码替换了您的类,但它运行正常:

[Serializable]
internal sealed class Test2 : Dictionary<int, int>
{
    internal Test2()
    {
    }

    private Test2(SerializationInfo info, StreamingContext context)
    {
        var data = (List<Tuple<string, string>>)
                   info.GetValue("data", typeof(List<Tuple<string, string>>));
        foreach (var item in data)
            Add(int.Parse(item.Item1), int.Parse(item.Item2));
    }

    public override void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        var data = new List<Tuple<string, string>>();
        foreach (var item in this)
            data.Add(Tuple.Create(item.Key.ToString(), item.Value.ToString()));
        info.AddValue("data", data, typeof(List<Tuple<string, string>>));
    }
}