XmlSerializer允许您在运行时动态指定attribute overrides
。让我们假设你有以下静态类:
public class Foo
{
public string Bar { get; set; }
}
和下面的XML:
<?xml version="1.0" encoding="utf-8" ?>
<foo bar="baz" />
,你可以在运行时动态添加映射不使用你的模型类的任何静态属性。就像这样:
using System;
using System.Xml;
using System.Xml.Serialization;
public class Foo
{
public string Bar { get; set; }
}
class Program
{
static void Main()
{
var overrides = new XmlAttributeOverrides();
overrides.Add(typeof(Foo), new XmlAttributes { XmlRoot = new XmlRootAttribute("foo") });
overrides.Add(typeof(Foo), "Bar", new XmlAttributes { XmlAttribute = new XmlAttributeAttribute("bar") });
var serializer = new XmlSerializer(typeof(Foo), overrides);
using (var reader = XmlReader.Create("test.xml"))
{
var foo = (Foo)serializer.Deserialize(reader);
Console.WriteLine(foo.Bar);
}
}
}
现在,所有剩下的你是编写可能读取XML文件,其中包含了属性覆盖,并在运行时,你会喂到XmlSerializer
从它建立的XmlAttributeOverrides
实例一些自定义代码构造函数。
有一点值得一提的是,当使用'XmlAttributeOverrides'时,用户应该花费很多精力来存储和重新使用'XmlSerializer'实例,以防止装配出血。 –
@ darin-dimitrov,根据[MSDN](http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx)XmlSerializer类的实例是线程安全的。这意味着您只需为每个XmlAttributeOverrides创建一个XmlSerializer的单例,然后即使在并行线程中也可以使用序列化来实现应用程序生命周期,不是吗? – DarkWalker
@DarkWalker,确实如此。 –