2012-04-04 5 views
12

Powiel możliwe:
How to serialize an IList<T>?Jak serializacji interfejs takich jak IList <T>

pragnę serializacji klasy (nazwijmy go S), który zawiera właściwość typu IList<T> gdzie T to kolejna klasa, którą zdefiniowałem. Dostaję wyjątek, gdy próbuję serializować instancję klasy S do XML. Jest to zrozumiałe, ponieważ XmlSerializer nie wie, której konkretnej klasy użyć. Czy istnieje sposób, miejmy nadzieję, używając atrybutów, do określenia, która konkretna klasa ma być instancjonowana podczas serializowania/deserializacji instancji. Moja implementacja klasy S tworzy instancję klasy List<T>. Oto kod do zilustrowania mój przykład:

using System; 
using System.Xml.Serialization; 
using System.IO; 

[Serializable] 
public class T { } 

[Serializable] 
public class S 
{ 
    public IList<T> ListOfTs { get; set; } 

    public S() 
    { 
     ListOfTs = new List<T>(); 
    } 
} 

public class Program 
{ 
    public void Main() 
    { 
     S s = new S(); 
     s.ListOfTs.Add(new T()); 
     s.ListOfTs.Add(new T()); 
     XmlSerializer serializer = new XmlSerializer(typeof(S)); 
     serializer.Serialize(new StringWriter(), s); 
    } 
} 

mam nadzieję jest atrybutem mogę umieścić powyżej definicji ListOfTs że mówi do serialize „zakładają wystąpienie List<T> podczas szeregowania/deserializacji”.

Odpowiedz

11

Zmiana

public IList<T> ListOfTs { get; set; } 

do

public List<T> ListOfTs { get; set; } 

Wtedy to będzie działać.

+3

Zrobiłbym to, gdyby nie to zmieniło interfejs dla klasy 'S'. Chociaż jest mało prawdopodobne, aby miało to praktyczny wpływ, ale z zasady chciałbym sprawdzić, czy istnieje sposób na rozwiązanie problemu bez zmiany typu. –

+0

Proponowane rozwiązanie, chociaż jest jedną pracę, może zrujnować publicznego API architekturę – bashis

0

można zaimplementować interfejs IXmlSerializable i realizować logikę ręcznie za pomocą serializacji XML i czytelników, pisarzy.

2

Myślę, że 2 sposoby, które są ogólnie podeszli do tego rodzaju problemu.

Można użyć DataContractSerializer, ale ponieważ już korzystasz z XmlSerializer, prawdopodobnie nie chcesz tego robić.

„alternatywa” ma mieć właściwość, która jest używana specjalnie dla celów serializacji i ignorować IList podczas serializacji.

[Serializable] 
public class S 
{ 
    IList<T> _listofTs; 

    [XmlIgnore] 
    public IList<T> ListOfTs { get _listofTs; set _listofTs = value; } 

    [XmlElement(Name="Not Exactly the Greatest Solution!")] 
    public List<T> ListOfTs { get _listofTs; set _listofTs = value; } 

    public S() 
    { 
     ListOfTs = new List<T>(); 
    } 
} 
+0

Korzystanie XmlIgnore atrybut na nieruchomości zostanie całkowicie zignorować. Pytania mają obejmować właściwość interfejsu w serializacji. –