XMLSerializer: десериализация как производный тип - PullRequest
2 голосов
/ 11 ноября 2011

Я скрестил пальцы на том, что кто-то там хорошо понимает 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)});

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

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

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

Другими словами, десериализовать CarParkResponse, унаследованный как 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 с «типом» в качестве атрибута.

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

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

Итак ...

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

Спасибо.

1 Ответ

0 голосов
/ 17 ноября 2011

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

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

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

...