2012-04-23 4 views
0

Я пытаюсь сериализовать объект .net, содержит в качестве параметра другой объект контракта данных. Код выглядит следующим образом ....NET JSON Сериализация: как иметь DataContract как член другого DataContract

[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()); 

Выполнение выше, приводит к следующему за исключением ...

"{" Тип 'JSONParser.Form1 + JsonObject2' с именем контракта данных «Form1.JsonObject2 : http: //schemas.datacontract.org/2004/07/JSONParser 'не ожидается. Добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных в DataContractSerializer. "}"

Я не могу понять, как выполнить любую из рекомендаций, приведенных в этом исключении.

  1. Как вы относитесь к списку известных типов?
  2. Как вы используете KnownTypeAttribute?

ответ

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? Это решило.

Смежные вопросы