2009-09-04 1 views
2

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

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

Возможно ли это?

ответ

2

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

0

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

0

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

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

0

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

Удачи вам!

Редактировать: Прочитать комментарий Томаса ниже. Наверное, он прав.

+1

Я бы советовал этому маршруту: XmlSerializer непосредственно не выполняет сериализацию, он создает другую сборку, чтобы сделать это. Поэтому вам придется изменить способ сборки сериализации, что может быть довольно сложно ... –

Смежные вопросы