2016-05-03 20 views
5
[DataContract] 
public class A : List<B> 
{ 
    [DataMember] 
    public double TestA { get; set; } 
} 

[DataContract] 
public class B 
{ 
    [DataMember] 
    public double TestB { get; set; } 
} 

Z modelu powyżej próbuję serializacji następujący obiekt:Serializować obiektu, gdy obiekt dziedziczy z listy

List<A> list = new List<A>() 
{ 
    new A() { TestA = 1 }, 
    new A() { TestA = 3 } 
}; 

json = JsonConvert.SerializeObject(list); 
//json: [[],[]] 

Gdzie są moje dwie wartości od TestA? Jest to możliwe duplikat z this thread (XML), ale chcę wiedzieć, czy nie ma opcji, aby uwzględnić te wartości, ustawiając niektóre opcje serializowania JSON? Uwaga: Tworzenie właściwości List<B> w klasie A zamiast dziedziczenia nie jest dla mnie opcją.

+2

Z ciekawości, dlaczego tworzysz klasę wywodzącą się z listy? Bardzo rzadko trzeba to robić. Znacznie bardziej sensowne jest stworzenie klasy zawierającej zarówno listę, jak i podwójną zamiast rozszerzającej listę. Zobacz pytanie "Dlaczego nie odziedziczyć po liście ?" (Http://stackoverflow.com/questions/21692193/why-not-inherit-from-listt) "i bardzo dobrą odpowiedź Eric Lippert. –

+1

Okazuje się, że Json.NET nie obsługuje serializacji kolekcji jako obiektów, gdy zastosowano metodę [DataContact]. Zobacz artykuł [Deserializing 'IEnumerable ' z zastosowanym '[DataContract]' nie działa] (http://stackoverflow.com/questions/35778811). – dbc

+0

@dbc Interesująca odpowiedź, zauważam, że mówisz * Byłaby w stanie dodać członków, jeśli twoja klasa zaimplementowała 'ICollection ' *, ale lista implementuje to, błąd? –

Odpowiedz

1

Według uwag powyższych istnieją dwa sposoby, aby uzyskać poprawny wynik (dzięki!):

  • wykonawcze zwyczaj JsonConverter (see here)
  • Workarround: Utwórz właściwość w klasie, która zwraca egzemplarze (see here)

Zresztą dziedziczą List<T> rzadko zdarza się być dobrym rozwiązaniem (see here)

Próbowałem go z workarround:

[JsonObject(MemberSerialization = MemberSerialization.OptIn)] 
public class A : List<B> 
{ 
    [JsonProperty] 
    public double TestA { get; set; } 

    [JsonProperty] 
    public B[] Items 
    { 
     get 
     { 
      return this.ToArray(); 
     } 
     set 
     { 
      if (value != null) 
       this.AddRange(value); 
     } 
    } 
} 

public class B 
{ 
    public double TestB { get; set; } 
} 

Działa to dla serializacji i deserializacji. Ważne: Items musi być Array z i nie może być używany. W przeciwnym razie deserializacja nie działa dla Items.

Powiązane problemy