在元素中将属性序列化为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); } } }