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 в базовый класс, а затем повторно сериализуйте в то, что вы хотите.
В зависимости от того, насколько много или мало у вас контроля над сборками, вы можете переопределить сериализацию унаследованного класса, чтобы он выполнял его как базовый класс.