0

別のデータ コントラクト オブジェクトをパラメーターとして含む .net オブジェクトをシリアル化しようとしています。コードは次のとおりです...

[DataContract]
        public class JsonObject2
        {
            [DataMember(Name = "field1")]
            string field1 { get; set; }
            [DataMember(Name = "field2")]
            string field2 { get; set; }
            [DataMember(Name = "field3")]
            object[][] test = { new object[]{"key1", "value1"}, new object[]{"key2", "value2"}, new object[]{"key3", "value3"} };
        }

        [DataContract]
        public class JsonObject3
        {
            [DataMember(Name = "field1")]
            public string field1 { get; set; }
            [DataMember(Name = "field2")]
            public object field2 { get; set; }
        }

DataContractJsonSerializer dcjs2 = new DataContractJsonSerializer(typeof(JsonObject3));

                JsonObject3 obj3 = new JsonObject3();
                obj3.field1 = "hello";
                obj3.field2 = new JsonObject2();
                dcjs2.WriteObject(s, obj3);
                s.Position = 0;
                MessageBox.Show(new StreamReader(s).ReadToEnd());

上記を実行すると、次の例外が発生します...

"{"データ コントラクト名が 'Form1.JsonObject2:http://schemas.datacontract.org/2004/07/JSONParser' のタイプ 'JSONParser.Form1+JsonObject2' は想定されていません。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加することにより、静的に認識されていない型を既知の型のリストに追加します。"}"

その例外で与えられた推奨事項を実行する方法がわかりません。

  1. KnownTypes のリストにどのように追加しますか?
  2. KnownTypeAttribute をどのように使用しますか?
4

1 に答える 1

0

わかりました、それを行う方法を考え出しました。他の誰かが役に立つと思った場合に備えて、この質問を削除したくなかったので、ここに解決策があります...

[DataContract]
    [KnownType(typeof(JsonObject2))]
    public class JsonObject2
    {
        [DataMember(Name = "field1")]
        string field1 { get; set; }
        [DataMember(Name = "field2")]
        string field2 { get; set; }
        [DataMember(Name = "field3")]
        object[][] test = { new object[]{"key1", "value1"}, new object[]{"key2", "value2"}, new object[]{"key3", "value3"} };
    }

    [DataContract]
    public class JsonObject3
    {
        [DataMember(Name = "field1")]
        public string field1 { get; set; }    
        [DataMember(Name = "field2")]
        public object field2 { get; set; }
    }

[KnownType(typeof(JsonObject2))]上記の JsonObject2 クラスの宣言に注目してください。それで解決しました。

于 2012-04-23T04:52:50.143 に答える