2013-11-15 145 views
5

在C#中,如果我序列化一個對象列表中的對象,它也會序列化列表?C#序列化一個對象與其中的對象列表

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

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

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

如果我序列此舉將存儲在移動中的所有標記獲取序列化呢?此外,如果它不會序列化列表,我將如何去做它呢?

<Move> 
    <MoveName>name</MoveName> 
    <Tag>Value</Tag> 
    ... 
</Move> 
+0

無論目前的答案是什麼,_how_是序列化它嗎?例如,如果您使用'XmlSerializer',它將起作用。 (儘管您可能需要使用一些特殊的屬性或創意才能獲得所需的特定XML模式輸出) –

+0

我正在使用XmlSerializer –

+1

您希望模式如何?你如何處理很多標籤似乎有點模棱兩可。應該是'名稱值1值2 ... ValueN'?另外,您是否靈活更改「Move」和「Tag」類? –

回答

9

是,採用t他XmlSerializer它會序列化一個List<T>只要T(或在你的情況Tag)是可序列化的。

​​

此輸出使用當前的階級結構爲:

<?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> 

我去看看,如果我能找到一種方法,以符合當前的XML模式,但是你可以看一下如何應用XmlAttributes和玩它自己。


編輯:

如果你改變你的類聲明中使用以下XMLATTRIBUTES,你將實現精確的XML架構在你的例子:

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

,當序列化會產生:

<?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

雖然這不匹配我在尋找明智的方案它確實回答我是否會挖掘我的對象中的列表的問題我序列化。 Brendan Hill發佈的鏈接爲我提供了一個非常好的主意,即如何爲我想要的佈局進行設置。謝謝。 –

+0

@maxinfet:檢查我的編輯/更新,我發現了一組屬性,它們將產生一個與您的模式相匹配的輸出。 –

+0

@maxinfet:另外,我稍微修改了我的序列化代碼,所以如果您已經複製/粘貼它,也許需要重新檢查它。 –

3

你確定你的類的聲明,就在你的問題? 你只是聲明Public Move,它應該是Public class Move

試試這個代碼

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

你的情況

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

輸出

<?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>