在元素中将属性序列化为Xml属性

我有以下class级:

[Serializable] public class SomeModel { [XmlElement("SomeStringElementName")] public string SomeString { get; set; } [XmlElement("SomeInfoElementName")] public int SomeInfo { get; set; } } 

其中(当填充一些testing数据时)以及使用XmlSerializer.Serialize()进行序列化时会得到以下XML:

 <SomeModel> <SomeStringElementName>testData</SomeStringElementName> <SomeInfoElementName>5</SomeInfoElementName> </SomeModel> 

我需要的是:

 <SomeModel> <SomeStringElementName Value="testData" /> <SomeInfoElementName Value="5" /> </SomeModel> 

有没有一种方法来指定此属性,而不写我自己的自定义序列化代码?

你将需要包装类:

 public class SomeIntInfo { [XmlAttribute] public int Value { get; set; } } public class SomeStringInfo { [XmlAttribute] public string Value { get; set; } } public class SomeModel { [XmlElement("SomeStringElementName")] public SomeStringInfo SomeString { get; set; } [XmlElement("SomeInfoElementName")] public SomeIntInfo SomeInfo { get; set; } } 

或者更通用的方法,如果你喜欢:

 public class SomeInfo<T> { [XmlAttribute] public T Value { get; set; } } public class SomeModel { [XmlElement("SomeStringElementName")] public SomeInfo<string> SomeString { get; set; } [XmlElement("SomeInfoElementName")] public SomeInfo<int> SomeInfo { get; set; } } 

接着:

 class Program { static void Main() { var model = new SomeModel { SomeString = new SomeInfo<string> { Value = "testData" }, SomeInfo = new SomeInfo<int> { Value = 5 } }; var serializer = new XmlSerializer(model.GetType()); serializer.Serialize(Console.Out, model); } } 

会产生:

 <?xml version="1.0" encoding="ibm850"?> <SomeModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SomeStringElementName Value="testData" /> <SomeInfoElementName Value="5" /> </SomeModel> 

那种,使用XmlAttribute而不是XmlElement ,但它看起来不像你想要的。 它将如下所示:

 <SomeModel SomeStringElementName="testData"> </SomeModel> 

我能想到的唯一方法就是实现你想要的(本地),就是让属性指向名为SomeStringElementName和SomeInfoElementName的对象,其中类包含一个名为“value”的getter。 你可以更进一步,使用DataContractSerializer,使包装类可以是私有的。 XmlSerializer不会读取私有属性。

 // TODO: make the class generic so that an int or string can be used. [Serializable] public class SerializationClass { public SerializationClass(string value) { this.Value = value; } [XmlAttribute("value")] public string Value { get; } } [Serializable] public class SomeModel { [XmlIgnore] public string SomeString { get; set; } [XmlIgnore] public int SomeInfo { get; set; } [XmlElement] public SerializationClass SomeStringElementName { get { return new SerializationClass(this.SomeString); } } }