2016-09-20 5 views
0

Ich habe eine Sammlung Klasse ICollection<T> mit einem paar benutzerdefinierten Attributen geworfen in Vollständigkeit der Umsetzung ..Serialisieren Klasse Umsetzung ICollection

In diesem simplen Beispiel, es ist eine einfache Anfrage/Ergebnisse Muster mit der Anforderung selbst zurück, als eine übergeben wird Attribut der Ergebnisklasse.

[Serializable] 
public class MyRequest 
{ 
    public int SearchID { get; set; } 
} 

[Serializable] 
public class MyResults : ICollection<MyElement> 
{ 
    public MyRequest RequestDetails { get; set; } 
    private ICollection<MyElement> _list = new List<MyElement>(); 

    /* ICollection interface methods removed */ 
} 

[Serializable] 
public class MyElement 
{ 
    public int ID { get; set; } 
} 

Hier ist das Beispielprogramm zu instanziieren und dann eine serialisierte Zeichenfolge ausgeben.

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyResults m = new MyResults(); 
     m.RequestDetails = new MyRequest() { SearchID = 1 }; 

     for (int i = 1; i <= 5; i++) 
     { 
      m.Add(new MyElement { ID = i }); 
     } 

     XmlDocument xmlDoc = new XmlDocument(); 
     XmlSerializer xmlSerializer = new XmlSerializer(m.GetType()); 
     using (MemoryStream xmlStream = new MemoryStream()) 
     { 
      xmlSerializer.Serialize(xmlStream, m); 
      xmlStream.Position = 0; 
      xmlDoc.Load(xmlStream); 
     } 

     System.Diagnostics.Debug.WriteLine(xmlDoc.OuterXml); 
    } 
} 

Das Problem ist, dass die Ausgabe der MyRequest Details ohne ist ...

<?xml version="1.0"?> 
<ArrayOfMyElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyElement> 
     <ID>1</ID> 
    </MyElement> 
    <MyElement> 
     <ID>2</ID> 
    </MyElement> 
    <MyElement> 
     <ID>3</ID> 
    </MyElement> 
    <MyElement> 
     <ID>4</ID> 
    </MyElement> 
    <MyElement> 
     <ID>5</ID> 
    </MyElement> 
</ArrayOfMyElement> 

Antwort

1

XmlSerializer immer zusätzliche Eigenschaften ignoriert, wenn eine Sammlung Serialisierung; der einzige Weg, es zu tun, soweit ich weiß, nicht ICollection<MyElement> auf MyResults Klasse zu implementieren ist, und stattdessen die Sammlung als eine Eigenschaft aussetzen:

public class MyResults 
{ 
    public MyRequest RequestDetails { get; set; } 
    public ICollection<MyElement> Items { get; set; } 
} 

(das Serializable Attribut nicht für die XML-Serialisierung benötigt)

+0

Dang it .... Danke ... –

+0

Auch musste 'ICollection <>' in 'List <>' ändern, da XmlSerialization keine Schnittstellen unterstützt –

Verwandte Themen