Можно ли сделать «смешанную» сериализацию XML в .net? - PullRequest
3 голосов
/ 09 ноября 2010

Я разрабатываю несколько сложных классов на VB.net (но вы можете написать свой ответ на C #, если вы предпочитаете: P), которые содержат данные, которые должны быть загружены из XML.Очевидное решение, конечно, состоит в том, чтобы разработать сериализуемый класс, чтобы автоматизировать процесс загрузки.

Теперь моя проблема заключается в следующем: структура XML исправлена, и я не могу ее изменить, иу него есть некоторые неудобства, из-за которых сериализация становится болезненной.Вот пример крошечного фрагмента DTD, который лучше объясняет проблему:

<!ELEMENT Relationship ( AttributePairs | AscendCaption | DescendCaption | ErrPreventInsertOrUpdateChild | ErrPreventDeleteParent | ErrPreventUpdateParent |ExtendedProperties |HiddenProperties )* >
<!ATTLIST Relationship 

    CountAggregates CDATA #IMPLIED
    CountReplicates CDATA #IMPLIED
    OnParentUpdate (PreventIfChildren|UpdateChildren) #IMPLIED
    OnParentDelete (PreventIfChildren|DeleteChildren|NullChildrenForeignKey) #IMPLIED
    IsEnforce (True|False) #REQUIRED 
    OnChildInsertOrUpdate (PreventIfNoParent|InsertParentIfNone) #IMPLIED
    ChildRoleName CDATA #IMPLIED
    ParentRoleName CDATA #IMPLIED
    ParentAttributeGroupInstance CDATA #IMPLIED
    ChildAttributeGroupInstance CDATA #IMPLIED

>

<!--Lots of other sutff not needed for this example -->

Как видите, все вышеперечисленные атрибуты можно легко сериализовать, просто объявив соответствующее свойство и расширив его с помощью <XmlAttribute()> тег.За исключением:

IsEnforce (True | False) # REQUIRED

Так как True и False не являются допустимыми логическими значениями в xml (из-за заглавных букв T и F), и процесс сериализации завершится ошибкой.

Теперь ... единственный другой вариант, который я знаю, - это реализовать IXMLSerializable вручную, что я сделал для других классов, и это работает, но это также означает, что я должен читать "вручную" каждый атрибут /элемент, даже те, которые я мог бы легко сериализовать автоматически с тегами.

Итак, наконец, мой вопрос: Возможно ли смешать два метода?То есть: автоматически сериализовать с тегами, а затем «войти» вручную и прочитать вручную более «хитрые» значения?(просто логический пример, предположим, я хочу вручную прочитать некоторые свойства по желанию)

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

вы всегда можете создать поле private (или с XmlIgnore) типа bool, а затем свойство, которое будет отображать его как True/False и иметь установщик, который может анализировать что-либо вроде T/F, True/False, Y/N и т. Д.

Для общего случая вы можете создать enum.

0 голосов
/ 10 ноября 2010

Если предложение Андрея не работает, вы можете вставить анализатор текста, который «исправляет» значения до или после операции сериализации / десериализации.

Возможное дублирование Альтернативы XmlSerializer и OnSerializing / OnSerialized

...