Получение сериализации XML для автоматического игнорирования несериализуемых свойств

Я использую классы сериализации .NET для сериализации XML и регистрации значений аргументов, которые передаются определенным функциям в моем приложении. Для этого мне нужны средства для XML-сериализации значений свойств любых классов, которые получают проходы, но игнорируя любые свойства, которые не могут быть сериализованы в XML (например, любые свойства типа Image).

Я мог бы пройтись по своим классам и пометить такие свойства атрибутом [XmlIgnore], но в идеале мне нужен сериализатор, который просто пропускает такие свойства.

Это достижимо?


person Richard Ev    schedule 04.09.2009    source источник


Ответы (4)


Вы можете использовать отражение для динамического создания _1 _ объект, чтобы добавить атрибут XmlIgnore в соответствующие свойства. Вам просто нужно реализовать логику, чтобы определить, подходит ли данный тип для сериализации XML, и рекурсивно просматривать граф объектов. Когда вы закончите создание объекта XmlAttributeOverrides, просто передайте его конструктору XmlSerializer

person Thomas Levesque    schedule 04.09.2009

Вероятно, это примерно так же эффективно, как ваша идея «XMLIgnore», но вы можете использовать XPath только для передачи сериализуемых частей в функцию сериализации.

person Anthony    schedule 04.09.2009

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

Кроме того, если вы «автоматически» игнорируете несериализуемые свойства для всех классов, вам нужно подумать об уровне, на котором вы это делаете - в противном случае ранее несериализуемые классы сами становятся сериализуемыми, но просто имеют несколько собственных свойств, которые не являются ( полностью) сериализуемый.

person Eamon Nerbonne    schedule 04.09.2009

Вы должны создать подкласс XmlSerializer и переопределить виртуальный защищенный метод Serialize (object, XmlSerializationWriter). Возможно, вам потребуется реализовать собственный XmlSerializationWriter.

Удачи!

Изменить: проверьте комментарий Томаса ниже. Думаю, он прав.

person Tor Haugen    schedule 04.09.2009
comment
Я бы посоветовал не использовать этот путь: XmlSerializer не выполняет сериализацию напрямую, он генерирует для этого другую сборку. Таким образом, вам придется изменить способ создания сборки сериализации, что может быть довольно сложно ... - person Thomas Levesque; 04.09.2009