XmlSerializer: десериализация как производный тип

#c# #serialization #xml-serialization #xml-deserialization

#c# #сериализация #xml-сериализация #xml-десериализация

Вопрос:

Я скрестил пальцы, что кто-то там хорошо разбирается в Microsoft XmlSerializer.

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

Введение

В моей текущей системе используется множество производных классов.

Например,

Базовый ответ -> Парковочный ответ -> унаследованный парковочный ответ

BaseResponse и CarParkResponse (оба в библиотеке dll) отделены от CarParkResponseInherited.

В результате базовые классы не знают о производном классе.

Что я сделал

-> Объявленные производные классы

Я ценю, что для того, чтобы xmlserializer выполнял свою работу, существует несколько способов объявления выделенных классов.

  • Объявляйте производные классы в базовых классах с помощью XmlInclude

или

  • Объявленные типы, подлежащие сериализации и десериализации в xmlSerialiser. Например:

Сериализатор XmlSerializer = новый XmlSerializer(typeof(CarParkResponse), новый тип[] { typeof(параметры парковки), typeof(информация о парковке) });

Я выбрал последнее.

Что я пытаюсь сделать

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

Другими словами, десериализуйте CARPARKRESPONSE, унаследованный как CarParkResponse.

В «CarParkResponseInherited» я использую объявление XmlTypeAttribute(«CarParkResponse»).

Изначально это вызывает проблему при сериализации

Типы ‘CarParkResponseInherited’ и ‘CarParkResponse’ оба используют имя типа XML, ‘CarParkResponse’, из пространства имен «. Используйте атрибуты XML, чтобы указать уникальное XML-имя и / или пространство имен для типа.»

поскольку тип «CarParkResponse» уже используется, я удалил XMLType(«Response») из «CarParkResponse», чтобы обойти это.

Проблема

Сейчас я пытаюсь десериализовать возвращенный XML, но теперь у меня возникает следующая проблема.

Указанный тип не был распознан: name=’CarParkResponse’, namespace=», при исходном запросе xmlns=»

К сожалению, ответ CarParkResponse присутствует. Мне интересно, связано ли это с тем фактом, что я использовал XMLType («Response») в классе, а сериализатор не распознает класс как тип CarParkResponse

Итак, мой вопрос

В принципе, возможно ли передать производный класс как подкласс и десериализовать его как подкласс с помощью XmlSerializer?

Я экспериментировал с созданным xml.

Например, если я нигде в своем коде не использую теги сериализации (такие как XMLType() и т.д.). Созданный XML-файл создаст элемент carparkresponse с «типом» в качестве атрибута.

Значение равно «CarParkResponseInherited». Я написал некоторый код, который удаляет «Унаследованный» из значения, которое позволяет его десериализовать.

Этот подход, очевидно, не очень хорош, поэтому я надеюсь, что есть хороший способ обойти это.

Итак…

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

Спасибо.

Ответ №1:

Возможно, было бы возможно что-то сделать, используя класс XmlAttributeOverrides. В основном он используется для переопределения определенных свойств, поэтому может быть, а может и не быть лучшим решением для вас.

Длинный путь обхода состоял бы в том, чтобы пойти дальше и сериализовать как унаследованный класс. Затем, если сопоставления совпадают, десериализуйте xml в базовый класс, а затем повторно сериализуйте в то, что вы хотите.

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

Комментарии:

1. Приветствую этот ответ, у меня была путаница с XmlAttributeOverrides, это продвинуло меня на шаг дальше, затем я столкнулся с некоторыми другими проблемами с данными внутри моего объекта ответа (одной из них был список). На данный момент мне пришлось отказаться от XmlSerializer. Я намерен вернуться к проблеме, когда у меня будет немного времени, и опубликовать ее здесь. Я использую наследование довольно интенсивно, и я думаю, что именно это вызывает проблему с XmlSerializer.