0

辞書型の辞書のメンバーを 1 つだけ含むクラスを定義しました。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>それをシリアル化するために必要なすべての処理が行われます。

4

1 に答える 1

0

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" } });
    }

    //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"}}}
于 2013-09-28T19:16:23.287 に答える