2013-11-15 14 views
5

In C# Wenn ich ein Objekt serialisieren, das eine Liste von Objekten darin enthält, wird es auch die Liste serialisieren?C# Serialisieren eines Objekts mit einer Liste von Objekten darin

Beispiel

public class Move { 
    public string MoveName {get; set;} 

    public List<Tag> oTags = new List<Tag>; 
} 

public class Tag { 
    public string TagName {get; set;} 
} 

Wenn ich unterwegs serialisiert werden alle in Schritt gespeicherten Tags sowie serialisiert werden? Auch wenn es die Liste nicht serialisiert, wie würde ich es machen?

+0

Unabhängig von den aktuellen Antworten werden _how_ Sie es Serialisierung? Wenn Sie zum Beispiel den 'XmlSerializer' verwenden, wird es funktionieren. (Sie müssen möglicherweise einige spezielle Attribute oder Kreativität verwenden, um die gewünschte XML-Schema-Ausgabe zu erhalten) –

+0

Ich verwende XmlSerializer –

+1

Wie möchten Sie das Schema? Es scheint ein wenig mehrdeutig, wie Sie mit vielen Tags umgehen. Sollte es sein ' Name Value1 Value2 ... WertN '? Sind Sie auch flexibel beim Ändern Ihrer "Move" - ​​und "Tag" -Klassen? –

Antwort

9

Ja, unter Verwendung von t Er XmlSerializer wird es eine List<T> serialisieren, solange T (oder in Ihrem Fall Tag) serialisierbar ist.

Move move = new Move { MoveName = "MyName" }; 
move.oTags.Add(new Tag { TagName = "Value1" }); 
move.oTags.Add(new Tag { TagName = "Value2" }); 
move.oTags.Add(new Tag { TagName = "Value3" }); 

StringBuilder output = new StringBuilder(); 
var writer = new StringWriter(output); 

XmlSerializer serializer = new XmlSerializer(typeof(Move)); 
serializer.Serialize(writer, move); 

Console.WriteLine(output.ToString()); 

Dies gibt Ihre aktuelle Klassenstruktur verwenden wie:

<?xml version="1.0" encoding="utf-16"?> 
<Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <oTags> 
    <Tag> 
     <TagName>Value1</TagName> 
    </Tag> 
    <Tag> 
     <TagName>Value2</TagName> 
    </Tag> 
    <Tag> 
     <TagName>Value3</TagName> 
    </Tag> 
    </oTags> 
    <MoveName>MyName</MoveName> 
</Move> 

Ich werde sehen, ob ich einen Weg finden kann Ihr aktuelles XML-Schema passen, aber man kann sehen, wie XmlAttributes anzuwenden und Spiel selbst damit herum.


EDIT:

Wenn Sie Ihre Klassendeklaration ändern Sie das folgende XmlAttributes zu verwenden, erhalten Sie das genaue XML-Schema wie in Ihrem Beispiel erreichen:

public class Move 
{ 
    [XmlElement(Order = 1)] 
    public string MoveName {get; set;} 

    [XmlElement(Order = 2, ElementName = "Tags")] 
    public List<Tag> oTags = new List<Tag>(); 
} 

public class Tag 
{ 
    [XmlText] 
    public string TagName {get; set;} 
} 

Welche wenn serialisierte produzieren:

<?xml version="1.0" encoding="utf-16"?> 
<Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MoveName>MyName</MoveName> 
    <Tags>Value1</Tags> 
    <Tags>Value2</Tags> 
    <Tags>Value3</Tags> 
</Move> 
+0

Obwohl das nicht dem entspricht, nach dem ich schemeweise suche, beantwortet es meine Frage, ob es durch die Liste in meinem Objekt graben wird, das ich serialisiere . Der Link, den Brendan Hill veröffentlicht hat, gibt mir eine ziemlich gute Idee, wie ich es für das Layout einrichten soll, das ich möchte. Vielen Dank. –

+0

@maxinfet: Überprüfen Sie meine Bearbeitung/Aktualisierung, ich habe eine Reihe von Attributen gefunden, die eine Ausgabe erzeugen, die Ihrem Schema entspricht. –

+0

@maxinfet: Außerdem habe ich meinen Serialisierungscode leicht verpfuscht, also überprüfe ihn vielleicht noch einmal, wenn du ihn bereits kopiert/eingefügt hast. –

3

Sind Sie sicher, dass Ihre Klasse Erklärungen direkt in Ihrer Frage sind? Sie sind nur Public Move erklärt, sollte es Public class Move sein

Versuchen Sie diesen Code

XmlSerializer serializer = new XmlSerializer(typeof(YourClass)); 

in Ihrem Fall

Move m = new Move(); 
      m.oTags.Add(new Tag() { TagName = "X" }); 
      m.oTags.Add(new Tag() { TagName = "XX" }); 

      XmlSerializer x = new XmlSerializer(typeof(Move)); 
      System.IO.Stream s; 

      var xmlwriter = System.Xml.XmlWriter.Create("C:\\MXL.txt"); 
      x.Serialize(xmlwriter, m); 

OutPut

<?xml version="1.0" encoding="utf-8"?> 
    <Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <oTags> 
<Tag> 
    <TagName>X</TagName> 
</Tag> 
<Tag> 
    <TagName>XX</TagName> 
</Tag> 
</oTags></Move> 
Verwandte Themen