WCF XmlElement序列化/反序列化

时间:2012-02-20 12:33:54

标签: wcf serialization deserialization

有一个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>

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

由于您的XML数据blob具有名为<AppData>的根元素,并且包含它的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>

根据您目前的情况,反序列化器会看到一个<AppData>元素,并假设它是WCF数据成员Public AppData As XmlElement。然后它会查看该元素并找到两个子元素<sometag><othertag>。但是,它只被告知要查找一个元素(XmlElement),因此忽略了第二个元素。

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