序列化包含Dictionary of Dictionary的类

时间:2013-09-28 19:04:52

标签: c# serialization javascriptserializer

我定义了一个只包含字典类型字典成员的类。我想将其序列化为JSON格式,因此使用JavaScriptSerializer

[Serializable]
class X
{
    private readonly Dictionary<string, Dictionary<string, string>> dic;

    public X()
    {
        dic = new Dictionary<string, Dictionary<string, string>>();
    }

    public void Add()
    {
        this.dic.Add("x", new Dictionary<string, string>() { { "a", "b" } });
    }
}


class Program
{
    static void Main(string[] args)
    {
        var x = new X();
        x.Add();
        string msg = new JavaScriptSerializer(new SimpleTypeResolver()).Serialize(x);
        var y = new JavaScriptSerializer(new SimpleTypeResolver()).Deserialize<X>(msg);
    }
}

现在,上面的代码运行成功,没有任何错误/异常,但结果不是例外。上面代码中的类X的序列化字符串是

{"__type":"Testing.X, Testing, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"}

有人能告诉我上面代码中的问题是什么,我错过了什么?另外,如果在上面的类中,我将内部字典类型更改为Dictionary<string, IEntity>,那么我需要做什么来序列化它。

1 个答案:

答案 0 :(得分:0)

JavaScriptSerializer默认情况下仅提取公共属性。通过getter或setter公开字段后,您应该能够序列化这些数据。

[Serializable]
class X
{
    private readonly Dictionary<string, Dictionary<string, string>> dic;

    public X()
    {
        dic = new Dictionary<string, Dictionary<string, string>>();
    }

    public void Add()
    {
        this.dic.Add("x", new Dictionary<string, string>() { { "a", "b" } });
    }

    //Property exposing private field 'dic'.
    public Dictionary<string, Dictionary<string, string>> Dictionary
    {
        get
        {
            return dic;
        }
    }
}


class Program
{
    static void Main(string[] args)
    {
        var x = new X();
        x.Add();
        string msg = new JavaScriptSerializer(new SimpleTypeResolver()).Serialize(x);
        var y = new JavaScriptSerializer(new SimpleTypeResolver()).Deserialize<X>(msg);
    }
}

在这种情况下,字符串包含以下输出(查看最后):

{"__type":"ConsoleApplication1.X, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","Dictionary":{"x":{"a":"b"}}}