В моем web method
я получаю объект некоторого третьего класса сущности С#. Класс сущности - это не что иное, как DataContract
. Этот класс сущностей довольно сложный и имеет свойства различных типов, некоторые свойства также являются коллекциями. Конечно, эти связанные типы также являются DataContracts.
Я хочу сериализовать этот объект DataContract в XML как часть бизнес-логики моего веб-сервиса. Я не могу использовать DataContractSerializer
напрямую (на объекте, который я получаю в веб-методе) просто потому, что XML-схема совсем другая. Таким образом, XML, сгенерированный DataContractSerializer, не будет проверяться на соответствие схеме.
Я не могу завершить подход, который я должен выполнить для реализации. Я мог бы подумать о следующих подходах реализации:
-
LINQ to XML. Это выглядит нормально, но мне нужно создать дерево XML (т.е. элементы или XML-представление экземпляра класса) вручную для каждого типа объекта. Поскольку существует много классов сущностей, и они связаны друг с другом, я думаю, что это слишком большая работа для записи XML-элементов вручную. Кроме того, мне придется продолжать модифицировать XML-дерево, когда класс сущности вводит новое свойство. Не только это, код, в котором я создаю XML-дерево, выглядел бы немного неуклюжим (по крайней мере, по внешнему виду) и будет сложнее поддерживать/изменять каким-то другим разработчиком в будущем; он/она должен будет смотреть на него так близко, чтобы понять, как генерируется этот XML.
-
XmlSerializer. Я могу написать свои собственные классы сущностей, которые представляют структуру XML, которую я хочу. Теперь мне нужно скопировать данные из входящего объекта в объект моих собственных классов. Так что это дополнительная работа (для .NET тоже при выполнении кода!). Затем я могу использовать
XmlSerializer
для моего объекта для генерации XML. В этом случае мне придется создавать классы сущностей, и всякий раз, когда будет изменен сторонний объект, мне придется просто добавить новое свойство в свой класс. (с атрибутами XmlElement или XmlAttibute). Но люди рекомендуютDataContractSerializer
над этим, и поэтому я не хочу завершать это, если все аспекты не ясны для меня. -
DataContractSerializer. Здесь снова я должен написать свой собственный класс сущностей, поскольку у меня нет контроля над сторонними DataContracts. И мне нужно скопировать данные из входящего объекта в объект моих собственных классов. Так что это дополнительная работа. Однако, поскольку DataContractSerializer не поддерживает атрибуты Xml, мне придется реализовать
IXmlSerializable
и сгенерировать требуемый Xml в методеWriteXml
. DataContractSerializer быстрее, чем XmlSerializer, но опять-таки мне придется обрабатывать изменения (в WriteXml), если изменяется сторонний объект.
Вопросы:
- Какой подход лучше всего подходит для этого сценария, учитывая также производительность?
- Можете ли вы предложить лучший подход?
- Стоит ли считать
DataContractSerializer
(потому что он имеет лучшую производительность по сравнению сXmlSerilaizer
), когда класс входящей сущности может быть изменен? - Должен ли LINQ действительно использоваться для сериализации? Или это действительно хорошо для вещей, кроме запросов?
- Может ли XmlSerializer быть предпочтительнее LINQ в таких случаях? Если да, то почему?