List的命名XML序列化

时间:2016-11-20 12:45:43

标签: c# xml serialization

我派生自List<int>,希望使用自定义名称进行XML序列化。例如:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;
namespace xmlerror
{
    [Serializable, XmlRoot("Foo")]
    public class Foo : List<int>
    {
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            var foo = new Foo();
            foo.Add(123);

            using (var writer = new StringWriter())
            {
                var serilizer = new XmlSerializer(typeof(Foo));
                serilizer.Serialize(writer, foo);
                Console.WriteLine(writer.ToString());
            }             
        }
    }
}

输出:

<?xml version="1.0" encoding="utf-16"?>
<Foo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <int>123</int>
</Foo>

但我想将元素命名为<Bar>而不是<int>。我尝试了XML属性XmlAnyElementXmlArrayItem但是没有结束。如何更改元素标签的名称?我是否必须使用XmlTextWriter手动执行此操作?

2 个答案:

答案 0 :(得分:1)

使用int以外的其他内容的最明显的解决方案。

public class Bar 
{
    public Bar(int value)
    {
        Value = value;
    }

    public Bar()
    {

    }

    [XmlText]
    public int Value { get; set; }
}

public class Foo : List<Bar>
{

}

有关正常工作的演示,请参阅this fiddle

另外,Serializable属性与XmlSerializer无关,可以省略。

答案 1 :(得分:1)

有很多方法可以做到。

例如,您可以实现IXmlSerializable接口。

[XmlRoot("Foo")]
public class Foo : List<int>, IXmlSerializable
{
    public XmlSchema GetSchema()
    {
        throw new NotImplementedException();
    }

    public void ReadXml(XmlReader reader)
    {
        reader.ReadToFollowing("Bar");

        while (reader.Name == "Bar")
            this.Add(reader.ReadElementContentAsInt());
    }

    public void WriteXml(XmlWriter writer)
    {
        foreach (var n in this)
            writer.WriteElementString("Bar", n.ToString());
    }
}