WCF-сериализация ответа от JAX WS на пустой объект - возможная проблема пространства имен? - PullRequest
3 голосов
/ 22 февраля 2012

Я использую клиент WCF для вызова веб-службы JAX.

Когда ответ десериализован, массив в объекте ответа всегда пуст. Однако, если я вручную добавлю пространство имен к типу массива в ответе с помощью инспектора сообщений, ответ будет десериализован правильно.

Итак, я получаю ответ:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" />
  <S:Body>
    <ns2:myResponse xmlns:ns2="http://mynamespace.com/">
      <myArray>
        <myObject>
          <myString>abcde</myString>
          <myInt>12345</myInt>
        </myObject>
      </myArray>
    <id>7777</id>
  </ns2:myResponse>
  </S:Body>
</S:Envelope>

и это создаст объект типа myResponse с правильным полем 'id', но пустым массивом типа myObject для поля myArray.

Когда я вручную редактирую полученное сообщение, добавляя псевдоним пространства имен 'ns2' перед тегами myObject, чтобы он выглядел так:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" />
  <S:Body>
    <ns2:myResponse xmlns:ns2="http://mynamespace.com/">
      <myArray>
        <ns2:myObject>
          <myString>abcde</myString>
          <myInt>12345</myInt>
        </ns2:myObject>
      </myArray>
    <id>7777</id>
  </ns2:myResponse>
  </S:Body>
</S:Envelope>

правильный объект десериализован, т.е. с myArray размера 1, содержащим правильный myObject.

Может кто-нибудь сказать мне, почему это так и как я могу заставить десериализацию WCF работать правильно без ручного вмешательства?

1 Ответ

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

Не уверен, что это именно ваша проблема, но, возможно, стоит попробовать.

У нас была похожая проблема.В нашем случае был сложный объект, который десериализовался с пропуском нескольких полей.Используя отладчик, мы могли видеть, что информация была там.Но мы не могли добраться до него через код.

Для нас работало приведение объекта к типу, который включал все поля.

Проверьте ваш файл reference.cs, какие типы данных там определены?

...