KnownType для всех производных типов абстрактного класса? - PullRequest
12 голосов
/ 07 июня 2011

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

Есть ли способ заставить DataContractSerializer трактовать ВСЕ производные этого абстрактного типа как KnownType?

Ответы [ 4 ]

8 голосов
/ 07 июня 2011

У меня была такая же проблема в службе WCF, и я сделал следующий "менее гнусный" взлом, чтобы обойти известное ограничение типа. Я обрисовываю в общих чертах только для того, чтобы показать альтернативные варианты, вам решать, лучше это или нет.

  1. При запуске службы загрузите с помощью отражения типы, которые вы хотите выставить. Например. если все ваши объекты, представленные WCF, происходят из общей абстрактной базы (или более), загрузите все типы из сборки, в которую они должны быть помещены. Кэшируйте эти типы статически для повышения производительности.

  2. Создайте статический метод, который возвращает указанные кэшированные типы со следующей подписью: public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)

  3. Пометить интерфейс WCF следующим атрибутом [ServiceKnownType("GetKnownTypes", typeof(StaticClassThatCachesTypes))]

Это должно дать вам автоматическое представление всех типов, которые или будут производными от базового класса (классов) по вашему выбору, если будущий разработчик (и) разместит их в правильной сборке .

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

Другой вариант в дополнение к предложенному Дэном С. - переключиться на NetDataContractSerializer - он не требует известных объявлений типов, поскольку он тесно связан с точной реализацией контракта, поэтому вы 'Вам нужно будет поделиться сборкой, которая содержит типы, между клиентом и сервером - и вы наверняка потеряете совместимость в этом сценарии.Есть несколько сообщений об этом (я видел этот , который часто появлялся в результатах поиска Google / Bing).

0 голосов
/ 26 февраля 2018

Этот является примером достижения этого с использованием IL-ткачества с использованием Fody / Mono.Cecil .

По сути, это расширение Fody , которое внедряет KnownTypeAttributes во время сборки с использованием IL Weaving.

Во время конвейера сборки расширение находит все базовые классы, помеченные атрибутом KnowsDeriveTypes (часть расширения), и добавляет атрибут KnownTypeAttribute ко всем производным классам (не обязательно напрямую) из одного из вышеуказанных базовых классов (с помощью KnowsDeriveTyepsAttribute).

Этот является еще одним зеркалом для поста, а здесь вы можете найти репозиторий Github для расширения.

0 голосов
/ 12 марта 2013

Здесь - это пример использования PostSharp. Посмотрите на нижнюю часть поста.

...