Знание типа WCF для базового класса - PullRequest
4 голосов
/ 26 мая 2011

У меня есть контракт данных в проекте (Comp.DataContracts), который не нужно знать ни о каких других проектах.У меня есть Comp.ProjA, который ссылается на Comp.DataContracts и имеет производный класс, который просто помогает заполнить поля контракта данных, но не имеет отношения к datacontract.Я хочу сказать каналу сделать сервисный вызов, используя мой производный тип в качестве параметра, но сериализовать его как базовый тип.

Поскольку я не хочу, чтобы проекты, связанные с услугами или контрактами на получение данных, знали о других проектах, как мне это сделать?Можно ли явно указать datacontractserializer сериализовать как базу вместо производной?Я всегда могу обратиться к фабрике, чтобы заполнить и вернуть правильный тип, но надеялся этого не делать.

Как мне сделать это без KnownType в базовом классе?Идеи?

Ответы [ 2 ]

4 голосов
/ 26 мая 2011

Если базовый тип является конкретным, вы можете использовать реализацию IDataContractSurrogate для сериализации всех экземпляров Derived как Base. В противном случае я не думаю, что это можно сделать без изменения базового класса для добавления [KnownType] или контракта на обслуживание для добавления [ServiceKnownType].

1 голос
/ 26 мая 2011

Не можете ли вы добавить KnownType через файл конфигурации, чтобы DataContractSerializer узнал о производном типе без жесткой зависимости между проектами?это будет означать, что производный тип будет сериализованным.

Другой вариант - использовать атрибут ServiceKnownType, который вызывает статический метод, и в этом методе создавать известные типы, используя GetType(typename).Это также позволит DCS узнать о производном типе, если он не является частью проекта или ссылочного проекта, и даже если базовый тип не является конкретным.

...