2013-11-15 144 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>