2012-04-04 15 views
12

Eventuali duplicati:
How to serialize an IList<T>?come serializzare un'interfaccia come IList <T>

desidero serializzare una classe (chiamiamolo S) che contiene una proprietà di tipo IList<T> dove T è un'altra classe che ho definito. Ricevo un'eccezione quando tento di serializzare un'istanza della classe S in XML. Questo è comprensibile dato che lo XmlSerializer non sa quale classe concreta usare. C'è un modo, si spera usando gli attributi, per specificare quale classe concreta istanziare durante la serializzazione/deserializzazione di un'istanza. La mia implementazione della classe S crea un'istanza della classe List<T>. Ecco il codice per illustrare il mio esempio:

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

spero ci sia un attributo che posso mettere sopra la definizione ListOfTs che dice al serializzare, "assumere un esempio di List<T> durante la serializzazione/deserializzazione".

risposta

11

Modificare il

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

a

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

Allora funzionerà.

+3

Farei questo, tranne che ciò cambierebbe l'interfaccia per la classe 'S'. Anche se è improbabile che questo abbia un impatto pratico, ma dal punto di principio, mi piacerebbe vedere se c'è un modo per risolvere il problema senza cambiare il tipo. –

+0

La soluzione suggerita, sebbene sia quella funzionante, potrebbe rovinare la tua architettura API pubblica – bashis

0

È possibile implementare l'interfaccia IXmlSerializable e implementare manualmente la logica di serializzazione utilizzando lettori e scrittori Xml.

2

Penso che ci siano 2 modi che vengono generalmente affrontati per questo tipo di problema.

Uno sarebbe utilizzare DataContractSerializer, ma poiché si sta già utilizzando XmlSerializer, probabilmente non si vuole farlo.

L'opzione "alternativa" consiste nell'avere una proprietà utilizzata specificamente per la serializzazione e ignorare IList durante la serializzazione.

[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

L'utilizzo dell'attributo XmlIgnore su una proprietà lo ignorerà del tutto. La domanda è di includere la proprietà dell'interfaccia nella serializzazione. –