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

Я скрестил пальцы, что у кого-то есть хорошее понимание Microsoft XmlSerializer.

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

Вступление

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

Например,

BaseResponse -> CarParkResponse -> CarParkResponseInherited

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

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

Что я сделал

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

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

  • Объявите производные классы в базовых классах, используя XmlInclude

или же

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

XmlSerializer serializer = new XmlSerializer (typeof (CarParkResponse), новый Type[] { typeof(CarParkParameters), typeof(CarParkInformation) });

Я пошел с последним.

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

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

Другими словами десериализовать CarParkResponseInherited как CarParkResponse.

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

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

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

так как тип уже используется "CarParkResponse", поэтому я объявил XmlType("Response") в "CarParkResponse", чтобы обойти это.

Эта проблема

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

Указанный тип не был распознан: name='CarParkResponse', namespace='', at OriginalRequest xmlns=''

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

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

Можно ли передать производный класс как подкласс и десериализовать его как подкласс с использованием XmlSerializer?

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

Например, если я не использую теги Сериализации (такие как XmlType() и т. Д.) Где-либо в моем коде. Созданный xml создаст элемент carparkresponse с атрибутом "type".

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

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

Так...

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

Благодарю.

1 ответ

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

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

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

Другие вопросы по тегам