VB.NET反序列化XML时Metadata节点解析问题求助
解决XML反序列化Metadata为空的问题
我一眼就看出问题所在了——你的XML特性标记和实际的XML结构不匹配,这才导致反序列化后Metadata始终为空。
先理清楚你的XML结构:每个<SubMenuItem>里的<Metadata>是一个容器节点,里面包含多个<MetadataItem>子节点。但你当前给Metadata属性标记的是<XmlElement("Metadata")>,这会让序列化器期望直接生成多个<Metadata>节点,而不是包裹在<Metadata>容器里的<MetadataItem>,自然找不到匹配的数据。
正确的特性标记方式
你需要把Metadata属性的特性改成<XmlArray>和<XmlArrayItem>的组合:
<XmlArray("Metadata")>:指定外层的容器节点名称<XmlArrayItem("MetadataItem")>:指定容器内每个子元素的名称
修改后的PECSubMenuItem类代码
<XmlType("MenuItem")> Public Class PECSubMenuItem ' 其他原有代码保持不变... Private mMetadataList As List(Of MetadataItem) Public Sub New() mGUID = System.Guid.NewGuid.ToString mMetadataList = New List(Of MetadataItem) End Sub ' 替换原来的XmlElement特性为以下组合 <XmlArray("Metadata"), XmlArrayItem("MetadataItem")> Public Property Metadata As List(Of MetadataItem) Get Return mMetadataList End Get Set(ByVal value As List(Of MetadataItem)) mMetadataList = value End Set End Property ' 其他原有属性和枚举保持不变... End Class
为什么这样有效?
<XmlArray("Metadata")>告诉序列化器:这个List对应的外层节点是<Metadata><XmlArrayItem("MetadataItem")>告诉序列化器:List里的每个元素要序列化为<MetadataItem>节点,放在<Metadata>容器内部
这完全匹配你提供的XML结构,反序列化时就能正确识别并填充Metadata列表了。
另外你的MetadataItem类特性是正确的,<XmlElement("description")>和<XmlElement("value")>刚好对应XML里的子节点,不需要修改。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

