c#序列化,DataMember(Name=)属性的可选集合
本文关键字:属性 集合 序列化 DataMember Name | 更新日期: 2023-09-27 18:12:45
我正在使用DataContractSerializer将我的DTO序列化为XML消息,但是我需要支持2种XML格式,它们在结构上是相同的,但在元素命名上不同,所以我需要在我的DTO上支持一组可选的DataMemeber[Name="]属性。如何在不克隆我的DTO类的情况下解决这个问题?我需要在运行时支持这两种格式,所以预处理器的衍生函数是不够的。
首先,对于细粒度的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>
一个可能的解决方案是使用替代的序列化器。
对于XML,我已经使用OXM映射器很长时间了,并取得了很多成功:http://code.google.com/p/oxm/