Я использовал DataContractResolver
раньше; и вот мои выводы:
- И клиент, и сервер требуют распознавателя; поскольку сериализация и десериализация происходит с обоих концов. Очевидно, что используется тот же Resolver.
- Имена типов являются стандартной частью информации, которую создает DataContractSerializer. Однако это просто тип NAME, а не полное (сборочное) имя
По сути, пользовательский распознаватель позволяет добавить его к клиенту и серверу WCF в качестве поведения:
`foreach (OperationDescription operation in myWCFService.Description.Endpoints[0].Contract.Operations)
{
operation.Behaviors.Find<DataContractSerializerOperationBehavior>()
.DataContractResolver = new MyDataContractResolver();
}`
Для клиента вы делаете то же самое:
`foreach (var operation in base.ChannelFactory.Endpoint.Contract.Operations)
{
operation.Behaviors.Find<DataContractSerializerOperationBehavior>()
.DataContractResolver = new MyDataContractResolver();
}`
Мой распознаватель динамически загружает типы из настроенного местоположения и, основываясь на каком-либо атрибуте, кэширует их. Я могу предоставить вам пример кода, если хотите, - все довольно просто.
KnownTypeAttribute (например, используя предоставленный метод для возврата всех известных типов) также можно использовать; но пользовательский распознаватель допускает более гибкий подход, такой как динамическая загрузка типов (например, система плагинов) и создание собственного отображения (Type => имя типа и наоборот)