Эффекты XmlIncludeAttribue при его использовании в WCF DataContract

1) Binding Используется ли при создании ChannelFactory какое-либо значение для того, как сериализация / десериализация работает? (Я знаю, что используемая привязка должна соответствовать привязке службы на стороне сервера.)

Я использую атрибут KnownType в одном из моих DataContract но это не работает. Но если я использую XmlIncludeAttribute, он работает! (Я переношу свои службы ASMX на WCF. Но я не использую никаких сообщений MessageContracts, поскольку у меня также есть возможность обновлять прокси на стороне клиента.)

[XmlInclude (typeof (Males))] [DataContract] открытый абстрактный класс Person {[DataMember] public int Name {get; набор; }}

2) Если я использую какой-либо атрибут (точнее - XmlInclude)), который использует XmlSerializer для WCF DataContract, использует ли WCF XmlSerializer вместо DataContractSerializer?


person Learner    schedule 28.02.2012    source источник
comment
Этот вопрос можно закрыть, так как вопрос слишком локализован. Использование привязки не влияет на сериализацию / десериализацию. XmlInclude использует XmlSerializer, а KnownType использует DataContractSerializer. Так что смешивать их не обязательно. Мне нужно было правильно использовать KnownType, чтобы избавиться от проблем.   -  person Learner    schedule 29.02.2012


Ответы (1)


DataContractSerializer поддерживает все, что поддерживает XmlSerializer, но обратное неверно. Но если тип украшен [DataContract], он полностью переключается на новую модель программирования DataContract, полностью отбрасывая поддержку типов [Serializable], IXmlSerializable и т. Д., Которые в противном случае были бы у него.

Итак, ваша магия [XmlInclude] работает, только если вы используете ASMX и традиционный XmlSerializer. Если вы используете DataContractSerializer, вам нужно использовать известные типы, а XML-измы, такие как [XmlInclude] и атрибуты XML, просто не поддерживаются. Тем не менее, вы все равно можете использовать XmlSerializer вместо DataContractSerializer, если хотите; все, что вам нужно сделать, это украсить службу или операцию, которую вы хотите переключить на XmlSerializer, с помощью [XmlSerializerFormatAttribute.]

Надеюсь это поможет!

person krisragh MSFT    schedule 27.04.2012