Любой способ контролировать порядок, в котором .NET XmlSerializer выводит атрибуты? - PullRequest
3 голосов
/ 29 февраля 2012

Я использую библиотеку, предоставленную третьей стороной, которая использует XML для связи с устройством. Корневой тег имеет 2 атрибута, которые должны присутствовать. Все примеры в документации показывают, что эти 2 атрибута появляются в определенном порядке.

Я создал классы для использования с классом .NET XmlSerializer, которые содержат свойства, помеченные соответствующими атрибутами XmlAttribute. Вывод XmlSerializer для моих классов имеет эти два атрибута в обратном порядке всех примеров в документации.

Если я передаю XML, сгенерированный моим кодом, в библиотеку, я получаю возвращаемое значение ошибки. Тем не менее, только для удовольствия, я изменил XML и изменил порядок атрибутов. И вот, я получил нормальное возвращаемое значение. Документация гласит, что библиотека написана на языке Ansi C, поэтому я уверен, что они не используют .NET XmlSerializer.

Я знаю, что стандарт XML говорит, что порядок атрибутов не важен. Я уведомил их, что их код нарушает стандарт, и, надеюсь, они это исправят. Но в Тем временем я должен добиться прогресса в этом проекте. Есть ли способ заставить XmlSerializer выводить атрибуты в обратном порядке? Или мне придется генерировать XML самостоятельно (гигантская боль в пату)?

По крайней мере, я могу проанализировать возвращенный мне Xml с классом XmlSerializer, и не имеет значения, в каком порядке находятся атрибуты в моем коде.

Спасибо

Tony

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Библиотека будет исправлена, поэтому я решил реализовать очень быстрое и грязное исправление.

Первоначально я реализовал метод ToXml (), который возвращал строку, содержащую XML, выданныйXmlSerializer.Этот метод был реализован в абстрактном базовом классе.Я пометил этот метод как виртуальный и оставил его в покое.Затем в каждом дочернем классе я реализовал переопределение метода ToXml, который просто использовал string.Format для создания Xml с атрибутами в нужном порядке.

Для реализации потребовалось около 5 минут, так как я в значительной степенипришлось просто копировать и вставлять одни и те же несколько строк кода несколько раз.

Все это исчезнет, ​​как только они исправят свой синтаксический анализатор.

Спасибо всем.

Tony

0 голосов
/ 29 февраля 2012

Боюсь, что реализация IXmlSerializable на данный момент является вашим единственным вариантом.

...