C#Serialization,DataMember(Name =)属性的备用集

时间:2011-10-31 07:23:26

标签: c# serialization datacontractserializer datacontract

我正在使用DataContractSerializer将我的DTO序列化为XML消息,但是我需要支持2种XML格式,它们结构相同但元素命名不同,所以我需要支持另一组DataMemeber [Name =“”我的DTO上的属性。如何在不克隆我的DTO课程的情况下解决这个问题?我需要在运行时支持这两种格式,因此preproccessor derectives是不够的。

2 个答案:

答案 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/ 认为它需要更多的工作,而不仅仅是应用属性。