C#使用其中的对象列表序列化对象

Max*_*ung 5 c# xml serialization

在C#中,如果我序列化一个包含对象列表的对象,它还会序列化列表吗?

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

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

public class Tag {
    public string TagName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

如果我序列化移动,那么存储在move中的所有标签也会被序列化吗?此外,如果它不会序列化列表,我将如何做到这一点?

<Move>
  <MoveName>name</MoveName>
  <Tag>Value</Tag>
  ...
</Move>
Run Code Online (Sandbox Code Playgroud)

Chr*_*air 9

是的,只要(或在您的情况下)可序列化,使用XmlSerializer它将序列化.List<T>TTag

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());
Run Code Online (Sandbox Code Playgroud)

这将使用您当前的类结构输出:

<?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>
Run Code Online (Sandbox Code Playgroud)

我将看看是否可以找到匹配当前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;}
}
Run Code Online (Sandbox Code Playgroud)

哪个序列化会产生:

<?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>
Run Code Online (Sandbox Code Playgroud)