【问题标题】:WCF XmlElement serialization/deserializationWCF XmlElement 序列化/反序列化
【发布时间】:2024-01-11 18:28:01
【问题描述】:

有一个 WCF 服务,它有一个带有自定义节点的 DataMember(项目的名称和数量可能不同) 示例:

<AppData>
 <sometag>something</sometag>
 <othertag>something else</othertag>
</AppData>

成员定义为:

  <DataMember(IsRequired:=False)>
  Public AppData As  XmlElement

它只适用于一项。

定义如下:

  <DataMember(IsRequired:=False)>
  Public AppData As List(Of XmlElement)

类名标签中的包裹内标签:

<AppData>
 <XmlElement><sometag>something</sometag></XmlElement>
 <XmlElement><othertag>something else</othertag></XmlElement>
</AppData>

【问题讨论】:

  • 我的解决方案是使用 属性: Public AppData As XmlElement

标签: wcf serialization deserialization


【解决方案1】:

由于您的 XML 数据 blob 有一个名为 &lt;AppData&gt; 的根元素,并且包含它的 WCF 数据成员也称为 AppData,因此 暗示序列化消息应该有两个嵌套元素,因此:

<AppData> <!-- this maps to the WCF DataMember field -->
    <AppData> <!-- this is the root element of your blob -->
        <sometag>something</sometag>
        <othertag>something else</othertag>
    </AppData>
</AppData>

根据您目前所拥有的,反序列化器正在查看一个 &lt;AppData&gt; 元素,并假设它是 WCF 数据成员 Public AppData As XmlElement。然后它在该元素内部查找并找到两个子元素&lt;sometag&gt;&lt;othertag&gt;。但是,它只被告知要查找一个元素 (XmlElement),因此它会忽略第二个元素。

您应该考虑更改 XML blob 的架构或包含它的 WCF 数据协定成员。

【讨论】:

  • 非常感谢您的回答,我找到了解决方案:它是用于类型定义的 属性。
【解决方案2】:

AppData 保留为XElement - 然后当您准备好发送数据时,只需创建一个新的XElement 将列表传递给它 - 它将创建一个包含许多子元素的父元素,每个XElemen t 在列表中。 XElement 的构造函数是 IEnumerable&lt;XElement&gt;aware

【讨论】: