我派生自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属性XmlAnyElement
和XmlArrayItem
但是没有结束。如何更改元素标签的名称?我是否必须使用XmlTextWriter
手动执行此操作?
答案 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());
}
}