【问题标题】:C# Serialize an object with a list of objects in itC#序列化一个包含对象列表的对象
【发布时间】:2013-11-15 02:43:17
【问题描述】:

在 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 存储在 move 中的所有标签也会被序列化吗?另外,如果它不会序列化列表,我将如何让它做到这一点?

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

【问题讨论】:

  • 不管当前的答案如何,您如何对其进行序列化?例如,如果您使用XmlSerializer,它将起作用。 (尽管您可能必须使用一些特殊属性或创造力来获得您想要的特定 XML 模式输出)
  • 我正在使用 XmlSerializer
  • 你想要怎样的架构?您如何处理许多标签似乎有点模棱两可。应该是&lt;Move&gt;&lt;MoveName&gt;name&lt;/MoveName&gt;&lt;Tag&gt;Value1&lt;/Tag&gt;&lt;Tag&gt;Value2&lt;/Tag&gt;...&lt;Tag&gt;ValueN&lt;/Tag&gt;&lt;/Move&gt;?另外,您是否灵活地更改了 MoveTag 课程?
  • 好吧,我正在简化设置,因为实际上我只是在寻找序列化是否会在我的对象中挖掘我的列表的答案,这在我的情况下是理想的效果。
  • 另外,检查对象是否已添加到列表中(可能是错误?!)

标签: c# xml serialization


【解决方案1】:

是的,使用 XmlSerializer 它将序列化 List&lt;T&gt;,只要 T(或在您的情况下为 Tag)是可序列化的。

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

使用您当前的类结构输出如下:

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

【讨论】:

  • 虽然这与我正在寻找的方案不匹配,但它确实回答了我的问题,即它是否会挖掘我正在序列化的对象中的列表。 Brendan Hill 发布的链接让我很好地了解了如何为我想要的布局进行设置。谢谢。
  • @maxinfet:检查我的编辑/更新,我发现一组属性将产生与您的架构匹配的输出。
  • @maxinfet:另外,我的序列化代码有点拙劣,所以如果你已经复制/粘贴了它,可以重新检查一下。
  • 如果可能的话,你能检查一下这个问题吗?:stackoverflow.com/questions/42490161/…
【解决方案2】:

您确定您的班级声明在您的问题中是正确的吗? 你只是声明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>

【讨论】:

    【解决方案3】:

    默认情况下,不会,因为列表中的项目可能无法序列化。

    如果是,那么您可能会发现以下页面很有用:

    XML Serialize generic list of serializable objects

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      相关资源
      最近更新 更多