#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.