WCF XmlElement сериализация / десериализация - PullRequest
1 голос
/ 20 февраля 2012

Наличие службы 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 ]

1 голос
/ 20 февраля 2012

Поскольку ваш BLOB-объект данных XML имеет корневой элемент с именем <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, либо члена контракта данных WCF.это содержит это.

1 голос
/ 20 февраля 2012

Сохранить AppData как XElement - тогда, когда вы будете готовы отправить данные, просто создайте новый XElement, передав ему список - он создаст родительский элемент с множеством дочерних элементов, по одному для каждого XElemen т в списке. Конструктор для XElemen t IEnumerable<XElement> осведомлен

...