WCF, возврат списка известных типов - PullRequest
0 голосов
/ 22 июня 2011

У меня есть служба на стороне сервера, которая называется ConstructionManager, одна из ее операций - GetAll(), которая возвращает список конструкций.Construction является контрактом данных, и есть несколько типов, которые наследуются от Construction (Buildings, Apartments и т. Д.)

Когда я отправляю список квартир, все хорошо, все свойстванаходится на их месте, но когда я получаю этот список на стороне клиента и вижу, что он находится в полученном объекте во время выполнения, в Non Public Members я увидел все свойства, специфичные для типа, который наследуется от Construction, напримерRooms, Floor, но в представлении результатов он показывает, что все свойства имеют значение "0", а не значение, с которым они были отправлены.

В контракте с данными Конструкция, в верхней части класса,являются атрибутами KnownType унаследованных классов.

Может быть полезно знать, я использую Фабрику программного обеспечения веб-сервисов.

Извините за мой плохой английский.

First image: Server Side GetAll() method, Floors have value:

Second image: Client Side Non public members of list, value of Floors=

Third image: Client Result View of  list, value of Floors=

1 Ответ

2 голосов
/ 22 июня 2011

Если вы видите, что свойства заполняются в объекте в вашем сервисе непосредственно перед , он отправляется по проводному соединению клиенту (т.е. непосредственно перед сериализацией), а затем видит, что в полученном объекте отсутствуетзначения в этих свойствах сразу после того, как получено клиентом, это означает, что они были потеряны в процессе сериализации.

О сериализации нужно помнить 2 вещи:

  1. Необходимо убедиться, что классы, которые вы отправляете по проводам, помечены атрибутом [DataContract], и что все свойства в них помечены атрибутом [DataMember].Если свойство не является типом .NET, то класс, который определяет (и свойства в нем), его также необходимо разметить этими атрибутами.

  2. Наследование классов теряется всериализации.Если вы создаете объект типа «Строительство», а ваш метод службы WCF возвращает тип «Строительство», то сообщение, отправленное клиенту, может не сериализоваться правильно (например, это может быть только сериализация свойств, определенных в базовом типе)."Строительство"?).Я предлагаю вам проверить это, заставив ваш сервис возвращать унаследованный тип, а не базовый, и посмотреть, решит ли он проблему.

Я думаю, что 2-й пункт является наиболее вероятнымпричина ваших проблем.Если вы предоставите свой код, я могу помочь вам более подробно

...