Интерфейс возврата контракта WCF может вызвать проблему сериализации? - PullRequest
7 голосов
/ 06 января 2009

Я пытаюсь определить контракт WCF, который возвращает интерфейс, как показано ниже:

[ServiceContract]
public interface IMyContracts
{
    [OperationContract]
    IMyInterface GetData(string request);
}

Чтобы заставить это работать, я думаю, что мой интерфейс (IMyInterface) должен был бы реализовать ISerializable, чтобы гарантировать, что классы, реализующие мой интерфейс, могут быть сериализованы. Это означает, что я должен вручную реализовать сериализацию для любых классов, реализующих мой интерфейс.

Похоже, что либо я использую свой интерфейс и рискую во время выполнения, если используется класс, который не сериализуем, либо я заставляю интерфейс реализовать ISerializable и у меня возникают проблемы с ручной реализацией.

Я запутываю себя и упускаю что-то очевидное? Как другие люди возвращали интерфейсы, использующие WCF, и избегали этой проблемы?

Большое спасибо.

Ответы [ 2 ]

14 голосов
/ 07 января 2009

AFAIK, проблема не в сериализации, а в том, что вы возвращаете абстрактную сущность (интерфейс). Абстракция - это концепция ОО, а не концепция SOA. Таким образом, стек wcf вашего клиента может не знать, что делать с классом за интерфейсом. Что делать, если клиент не знает класс позади интерфейса. Стек WCF клиента должен десериализовать его, и для этого он должен знать класс.

Итак, вы должны сделать класс (ы) за интерфейсной частью вашего контракта через KnownTypeAttribute .

Вы также можете использовать ServiceKnownTypeAttribute класс, который кажется более гибким. Тем не менее, помните, что клиент должен знать тип, или вы получите исключение.

0 голосов
/ 02 марта 2010

В этом посте я подробно расскажу о том, как заставить WCF работать для получения и возврата производных классов и интерфейсов.

http://codeonaboat.wordpress.com/2010/03/01/serializing-and-deserializing-derived-types-or-interfaces-in-wcf/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...