2010-02-16 4 views
0

.NET 2Comment Xml sérialiser une LinkedList?

En fait, il existe des méthodes pour XML sérialisent un List<T>. Que faire si j'ai un objet qui a un membre LinkedList<T> public? Sans créer un doublon public comme List<T> de LinkedList<T>. Peut-être un moyen de contrôler la sérialisation Xml comme binaire (OnSerializing, OnDeserializing).

Sera impossible de sérialiser XML un objet avec un membre LinkedList<T> public?

EDIT:

Un exemple de test pour fixer avec IXmlSerializable

using System.Xml.Serialization; 

public class Foo : IXmlSerializable {     
    private int _Id; 
    private string _Name; 

    public string Name { 
        get { return _Name; } 
        set { _Name = value; } 
    }     
    
    private int _Age; 
    public string Age { 
        get { return _Age; } 
        set { _Age = value; } 
    } 
    
    private LinkedList<Bar> _linkedList = new LinkedList<Bar>(); 
    [XmlArray()] 
    public List<Bar> MyLinkedList { 
        get { return _linkedList; } 
        set { _linkedList = value; } 
    } 
    
    public System.Xml.Schema.XmlSchema GetSchema() { 
        return null; 
    } 
    
    public void ReadXml(System.Xml.XmlReader reader) { 
        _Name = reader.ReadString(); // ? '            
        _Age = reader.ReadString(); // ? ' 
     // foreach MyLinkedList 
    } 
    
    public void WriteXml(System.Xml.XmlWriter writer) { 
        writer.WriteString(_Name); // ? ' 
        writer.WriteString(_Age); // ? ' 
     // foreach MyLinkedList 
    } 
} 
+0

double possible de [LinkedList ne peut pas être publié en feuilleton en utilisant la XMLSerializer] (http://stackoverflow.com/questions/2237584/linkedlistt-can-not-be-serialized-using-the-xmlserializer) – nawfal

Répondre

2

Il est impossible avec sans mettre en œuvre IXmlSerializable ou la création d'un double public List<T> de LinkedList<T>. DataContractSerializer est capable de le faire, mais malheureusement, il n'est pas disponible dans .NET 2.0.


MISE À JOUR:

Voici un exemple de mise en œuvre IXmlSerializable sérialiser un LinkedList<T>:

public class Foo : IXmlSerializable 
{ 
    public LinkedList<int> List { get; set; } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     throw new System.NotImplementedException(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteStartElement("List"); 
     foreach (var item in List) 
     { 
      writer.WriteElementString("Item", item.ToString());  
     } 
     writer.WriteEndElement(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var foo = new Foo 
     { 
      List = new LinkedList<int>(new[] { 1, 2, 3 }) 
     }; 
     var serializer = new XmlSerializer(foo.GetType()); 
     serializer.Serialize(Console.Out, foo); 
    } 
} 

Comme vous pouvez le voir qu'il fait essentiellement la sérialisation à la main donc il n'y a pas beaucoup d'avantages de la XmlSerializer ici.

+0

intéressant IXmlSerializable ... Un exemple de comment puis-je sérialiser un LinkedList avec? – serhio

+0

Oui, voir ma mise à jour. –

+0

Merci, c'est intéressant. Maintenant, une précision de plus. Que faire si le LinkedList , où T est un objet personnalisé (disons «Bar»). Bar peut être aussi XmlSerailizable, ou XmlSerializable personnalisé, ou également pas Serializable du tout. – serhio