Пользовательский XML-сериализация, как написать пользовательский корневой элемент?

2

Я, вероятно, просто делаю это неправильно, я знаю.

Я использую пользовательскую сериализацию, и когда генерируется xml, он помещает имя класса в качестве корневого элемента

Пример:

<MyClassName>
 <MyIntendedRootNode>
   <ObjectType>
     <Property1/>
     <Property2/>
...

Я вызываю сериализацию, вызывая xmlserializer.Serialize(writer, Me), поэтому я уверен, что это как-то связано с ней.

Я попытался помещать XMLRoot в класс, но я думаю, что, поскольку vb компилирует этот частичный класс со своей страницей aspx, он либо перезаписывает это свойство, либо полностью игнорирует его.

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

Кто-нибудь еще делает это, кроме меня?

Спасибо

  • 0
    «... компилирует этот частичный класс с его страницей aspx ...» Вы имеете в виду, что сериализуете класс страницы? Можете ли вы отредактировать свой вопрос, чтобы предоставить нам образец класса, который вы пытаетесь сериализовать? XMLRoot должен просто работать.
Теги:
xml-serialization

5 ответов

3
Лучший ответ

Вы можете использовать либо IXmlSerializable, либо использовать атрибуты XML. Я использую XmlSerializer, передавая корень в конструкторе.

var MemoryStream ms;
var customRoot = dataObject as XmlRootAttribute;
var xml = new XmlSerializer(dataObject.GetType(), customRoot);
xml.Serialize(ms, dataObject);
  • 0
    Отлично! Это работает. Я немного поэкспериментирую и, надеюсь, найду хорошую литературу по сериализатору xml. еще раз спасибо
1

Или вы можете реализовать IXmlSerializable и иметь полный контроль над своим Xml, но его немного больше усилий, чтобы изменить имя корневого элемента.

  • 0
    Это то, что я делаю. просто генерируется корневой элемент, который продолжает появляться.
1

В ASP.NET фактический класс, который загружается, является сгенерированным классом, который наследуется от вашего класса. (Оказывается - удивительно, что этот сгенерированный код фактически отделен от дополнительного сгенерированного кода, который сочетается с вашим кодом, используя метод частичного класса. Сгенерированный класс имеет то же имя, что и класс, над которым вы работаете, но он находится в другом пространстве имен.) Поскольку XmlRoot не является наследуемым атрибутом, XmlSerializer не видит его.

Я не думаю, что есть какое-либо решение (кроме изменения документа после его создания).

1

Вы пытаетесь сериализовать файл codebehind?

Я бы предложил написать модель, чтобы содержать данные, которые нужно сохранить, а затем вместо этого сериализуем. Затем используйте соответствующие атрибуты XMLWriter, чтобы убедиться, что ваш корневой элемент правильно назван.

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню