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

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

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

Пример:

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

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

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

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

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

Спасибо

Ответы [ 5 ]

3 голосов
/ 16 марта 2010

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

var MemoryStream ms;
var customRoot = dataObject as XmlRootAttribute;
var xml = new XmlSerializer(dataObject.GetType(), customRoot);
xml.Serialize(ms, dataObject);
1 голос
/ 16 марта 2010

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

1 голос
/ 16 марта 2010

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

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

1 голос
/ 16 марта 2010

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

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

0 голосов
/ 16 марта 2010

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

...