XML Serializer - 序列化程序的高级功能(C#)

时间:2014-11-28 18:11:45

标签: c# xml xml-serialization

这是我目前的代码:

List<Tile> listTiles = new List<Tile>();

for (int i = 0; i < Width; i++)
for (int j = 0; j < Height; j++)
{
    //Load each tile into the list
    listTiles.Add(mapbox.RenderedMap.Tiles[i, j]);
}

XmlSerializer serializer = new XmlSerializer(listTiles.GetType(), new  XmlRootAttribute("Map"));
StreamWriter writer = new StreamWriter(@"savedmap.xml");
serializer.Serialize(writer.BaseStream, listTiles);

它基本上做的是将每个当前图块加载到列表中,然后按以下格式序列化:

<Map>
    <Tile>TileData</Tile>
</Map> 

将Map作为根节点。

我的问题是:我怎样才能做到这一点,而不是我现在拥有的,我有以下几点?

<GameSave>
    <Map>
        <Tile>TileData</Tile>
    </Map>
    <Options>
    </Options>
</GameSave>

所以基本上,添加一个根节点并将我的Map节点放入其中(包含Tile节点),以及一个options节点。我是否必须改变我这样做的方式而不使用列表,因为列表只包含瓷砖?

1 个答案:

答案 0 :(得分:0)

您需要一个具有适当XML属性的包装对象,以便序列化程序了解您所需的格式。以下显示了它的外观:

public class Tile
{
    public string TileData { get; set; }
}

public class Option
{
    public string Key { get; set; }
    public string Value { get; set; }
}

[XmlRoot("GameSave")]
public class GameSave
{
    [XmlArray("Map")]
    [XmlArrayItem("Tile")]
    public List<Tile> Tiles { get; set; }

    [XmlArray("Options")]
    [XmlArrayItem("Option")]
    public List<Option> Options { get; set; }
}

然后,在生成GameSave对象后,您将看到以下输出:

<?xml version="1.0" encoding="utf-16"?>
<GameSave xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Map>
    <Tile>
      <TileData>Test</TileData>
    </Tile>
  </Map>
  <Options>
    <Option>
      <Key>Option</Key>
      <Value>Value</Value>
    </Option>
  </Options>
</GameSave>