我正在使用DataContractSerializer将我的DTO序列化为XML消息,但是我需要支持2种XML格式,它们结构相同但元素命名不同,所以我需要支持另一组DataMemeber [Name =“”我的DTO上的属性。如何在不克隆我的DTO课程的情况下解决这个问题?我需要在运行时支持这两种格式,因此preproccessor derectives是不够的。
答案 0 :(得分:1)
首先,对于细粒度的xml序列化,XmlSerializer
优于DataContractSerializer
(这对于通用序列化程序来说很好,但很难认真对待xml序列化程序,它甚至无法处理属性)。
其次,XmlSerializer
有此选项 - 特别是XmlAttributeOverrides
。使用XmlAttributeOverrides
,您可以在运行时为您的类型配置整个设置,然后将其传递给XmlSerializer
构造函数。 重要警告:执行此操作并存储序列化程序实例,否则会导致动态组件出血。
[XmlRoot("foo")]
public class Foo
{
[XmlElement("bar")]
public string Bar { get; set; }
}
class Program
{
static void Main()
{
XmlAttributeOverrides xao = new XmlAttributeOverrides();
xao.Add(typeof(Foo), new XmlAttributes { XmlRoot =
new XmlRootAttribute("alpha")});
xao.Add(typeof(Foo), "Bar", new XmlAttributes { XmlElements = {
new XmlElementAttribute("beta") } });
var ser = new XmlSerializer(typeof (Foo), xao);
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
ser.Serialize(Console.Out, new Foo { Bar = "abc"}, ns);
}
}
带输出:
<alpha>
<beta>abc</beta>
</alpha>
答案 1 :(得分:0)
其中一个可能的解决方案是使用替代序列化器。
对于XML,我已经使用了OXM mapper很长一段时间并取得了很多成功:http://code.google.com/p/oxm/ 认为它需要更多的工作,而不仅仅是应用属性。