C # десериализация XML с несколькими возможными пространствами имен - PullRequest
8 голосов
/ 11 февраля 2011

Я создал библиотеку классов-оболочек API для использования остальных API сторонних разработчиков.

Все работало, пока они недавно не обновили API в последней версии своего продукта и не добавили пространство имен к корневому элементу, теперь мой код десериализации не выполняется.

Пример одного из моих классов:

[Serializable]
[XmlRootAttribute(ElementName = "exit_survey_list")]
public class SupportExitSurveyCollection : ApiResult { .... }

Если для свойства Namespace в XmlRootAttribute установить новое возвращаемое пространство имен, оно снова будет работать правильно.

Но мне нужно поддерживать обе версии API (с именами и без), потому что я не могу быть уверен, какая версия API будет доступна.

Я бы хотел, чтобы это работало без дублирования классов для разных версий, но не уверен, возможно ли это.

Спасибо за любой вклад / совет.

1 Ответ

1 голос
/ 11 февраля 2011

Я не думаю, что это возможно.

Вы можете реализовать интерфейс IXmlSerializable и самостоятельно управлять сериализацией - это будет работать, но, вероятно, это не то, что вам нужно, поскольку для этого потребуется, чтобы вы выполняли большую часть отображения самостоятельно в коде. 1005 *

Другим вариантом будет предварительная обработка сообщений и добавление пространства имен, если оно отсутствует. Тогда у вас может быть один процесс десериализации.

...