Некоторые элементы схемы не поддерживаются DataContractSerializer
, например, элементом xs:choice
. Знайте, что если вы в конечном итоге используете любой из этих неподдерживаемых элементов, вам будет очень сложно переключиться на Data Contracts, если вы когда-либо захотите.
Кроме того, существует неплохой пробой DataContractSerializer
против XmlSerializer
here. Вероятно, наиболее важными моментами являются:
DataContractSerializer
обычно более эффективен;
DataContractSerializer
может сериализовать поля (XmlSerializer
нуждается в свойствах);
XmlSerializer
требует общественных геттер и сеттеров для каждой сериализованной собственности (это очень раздражает и может привести к некоторым неоптимальным конструкциям);
XmlSerializer
требует публичного конструктора без параметров (DataContractSerializer
фактически проигнорирует его);
XmlSerializer
отказывается по умолчанию, тогда как DataContractSerializer
- это отказ;
XmlSerializer
, скорее всего, сможет взаимодействовать с унаследованными клиентами (то есть веб-сервисами ASMX и другими платформами);
Вообще говоря, XmlSerializer
дает намного больший контроль над XML, но DataContractSerializer
дает намного больший контроль над кодом. Если вы хотите использовать XML-сериализатор, вам нужно кодировать свои прихоти, тогда как вы можете интегрировать Data Contracts практически с любым кодом.
Я больше интересовался тем, какие функции WCF вне сериализации могут быть заблокированы или предотвращены, если мы пошли с XmlSerialization. Все ли другие функции WCF одинаково применимы, когда мы выбираем XmlSerialization? (И да - мы используем опцию «Выбор» в наших XSD. По XmlSerialization мы просто делаем SOAP, а не WCF на самом деле? Как, например, можем ли мы по-прежнему делать SOAP-Faults с XmlSerialization? – NealWalters
@NealWalters: они добавили 'SupportsFaults' в .NET 3.5 SP1, так что да, вы все равно можете это сделать: http://blogs.msdn.com/rickrain/archive/2008/10/03/xmlserializer-faults.aspx. Единственное другое ограничение I знаете, что вы не можете использовать 'XmlIncludeAttribute', но это заменено на' KnownTypeAttribute'. Кроме того, я думаю, что они одинаковы с точки зрения поддержки функций, но я не могу утверждать, что я пробовал что-либо и все. – Aaronaught