2009-03-12 18 views
4

Ich möchte eine Sammlung von Objekten zum Speichern/Abrufen aus meiner app.config-Datei serialisieren. (Ich verwende den Code aus einem Beispiel von Jeff Attwoods Blogeintrag The Last Configuration Section Handler.. Revisited).Serialisierung von Sammlungen in .net

Was ich wissen will, ist, warum Sammlungen von Objekten des Typs

public class MyClass 
{ 
    ... 
} 

zu einem XML-Elemente serialisiert bekommen genannt

<ArrayOfMyClass>...</ArrayOfMyClass> 

In diesem Beispiel mir eine generische Liste von MyClass mit Objekte. Ich habe auch versucht, eine neue Klasse zu erstellen, die von List erbt und das resultierende XML ist genau das gleiche.

Gibt es eine Möglichkeit, den beim Serialisieren/Deserialisieren verwendeten XML-Elementnamen zu überschreiben?

+0

meine Antwort aktualisiert, mit einer sehr einfachen Lösung – eglasius

Antwort

4

Wenn Sie von Liste erben Sie etwas entlang der Linien von

[Serializable] 
[System.Xml.Serialization.XmlRoot("SuperDuperCollection")] 
public class SuperDuperCollection : List<MyClass> { ... } 
versuchen können,

um Ihre Klasse zu dekorieren, sollten Sie mit den verschiedenen XmlAttributes steuern, wie die XML bei der Serialisierung ausgegeben wird.

Nur ein zusätzliches Bearbeiten mit einigen Testcode und Ausgang:

[Serializable] 
public class MyClass 
{ 
public int SomeIdentifier { get; set; } 
public string SomeData { get; set; } 
} 

.... 

SuperDuperCollection coll = new SuperDuperCollection 
{ 
    new MyClass{ SomeData = "Hello", SomeIdentifier = 1}, 
    new MyClass{ SomeData = "World", SomeIdentifier = 2} 
}; 

Console.WriteLine(XmlSerializeToString(coll)); 

Ausgang:

<SuperDuperCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyClass> 
    <SomeIdentifier>1</SomeIdentifier> 
    <SomeData>Hello</SomeData> 
    </MyClass> 
    <MyClass> 
    <SomeIdentifier>2</SomeIdentifier> 
    <SomeData>World</SomeData> 
    </MyClass> 
</SuperDuperCollection> 
+0

Sie ohne die zusätzliche Klasse tun können, lesen Sie meinen aktualisierte Antwort – eglasius

3

Sie tun es nicht, wenn sie Kind-Elemente eines Typs sind - Sie [XmlRoot] verwenden können, [XmlType], [XmlElement] und [XmlArray] und [XmlArrayItem] in verschiedenen Kombinationen zu unterschiedlichen Ergebnissen zu bekommen - leider sind die Besonderheiten über die genaue Layout abhängig sind ...

Verwandte Themen