В моем web method
я получаю объект некоторого третьего класса сущности C#. Класс сущности - это только DataContract
. Этот класс сущностей довольно сложный и имеет свойства различных типов, некоторые свойства также являются коллекциями. Конечно, эти связанные типы также являются DataContracts.Linq to Xml VS XmlSerializer VS DataContractSerializer
Я хочу сериализовать этот объект DataContract в XML как часть бизнес-логики моего веб-сервиса. Я не могу использовать DataContractSerializer
непосредственно (на объекте, который я получаю в веб-методе) просто потому, что XML-схема совсем другая. Таким образом, XML, сгенерированный DataContractSerializer, не будет проверен на соответствие схеме.
Я не могу завершить подход, который я должен выполнить для реализации. Я мог бы подумать о следующих подходах к осуществлению:
LINQ к 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 в таких случаях? Если да, то почему?
Благодарим за сообщение. Решение, предоставленное там, не полезно для моей проблемы, но помогло узнать еще один способ использования LINQ! – Learner