.NET序列化List<CustomerDetails>时为XML节点添加属性的可行方案
如何在XML序列化时将类属性转为XML元素的属性?
你目前通过XmlSerializer序列化List(Of CustomerDetails)集合,代码如下:
Private Sub CustomerDetailsExportToXml(Details As System.Collections.Generic.List(Of CustomerDetails)) Dim x As New System.Xml.Serialization.XmlSerializer(Details.GetType) Using s As New FileStream("customerdetails.xml", FileMode.Create) x.Serialize(s, Details) End Using End Sub
得到的XML输出中,Acronym是CustomerDetails的子元素:
<?xml version="1.0"?> <ArrayOfCustomerDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <CustomerDetails> <Acronym>MSD</Acronym> <FriendlyName>Main Street Diner</FriendlyName> </CustomerDetails> </ArrayOfCustomerDetails>
你希望将Acronym转为CustomerDetails元素的属性(即<CustomerDetails Acronym="MSD">),且担心序列化后修改XML会导致反序列化失败——完全可以在序列化时直接实现这个需求,不需要后续修改XML。
解决方案:给类属性添加XmlAttribute特性
只需要在CustomerDetails类的Acronym属性上标记<XmlAttribute>特性,XmlSerializer就会自动将该属性序列化为XML元素的属性,同时完全兼容反序列化。
修改后的CustomerDetails类代码:
Imports System.Xml.Serialization Public Class CustomerDetails <XmlAttribute> Public Property Acronym As String Public Property FriendlyName As String End Class
最终序列化结果
使用你原有的序列化代码,生成的XML会变成:
<?xml version="1.0"?> <ArrayOfCustomerDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <CustomerDetails Acronym="MSD"> <FriendlyName>Main Street Diner</FriendlyName> </CustomerDetails> </ArrayOfCustomerDetails>
说明
- 这种方式不需要修改任何序列化逻辑,原有的
CustomerDetailsExportToXml方法可以直接复用。 - 反序列化时,
XmlSerializer会自动识别CustomerDetails元素的Acronym属性,并映射回类的Acronym属性,不会出现兼容性问题。
内容的提问来源于stack exchange,提问作者DWRoelands
相关产品推荐
相关产品推荐

