Переопределить атрибут XmlRoot, определенный в классе конструктора набора данных - PullRequest
2 голосов
/ 22 декабря 2009

У меня есть набор данных с именем DocumentDataSet вместе с классом с именем Document.

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

Я хотя и определяю атрибут XmlRoot в частичном классе набора данных, но не могу добавить дубликат XmlRoot, поскольку он уже определен в классе конструктора.

[global::System.Xml.Serialization.XmlRootAttribute("DocumentDataSet")]
public partial class DocumentDataSet : global::System.Data.DataSet { ... }

Я мог бы изменить его в классе конструктора, но он сбрасывается каждый раз, когда я открываю набор данных в дизайне.

Есть ли способ переопределить XmlRoot или заставить его сериализоваться с другим именем, чем его имя класса?

1 Ответ

2 голосов
/ 22 декабря 2009

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

new XmlSerializer(typeof(DocumentDataSet), new XmlRootAttribute("Document"));

Также возможно сделать что-то вроде этого:

class DocumentDataSet : DataSet
{
    public new string GetXml()
    {
        return base.GetXml().Replace("DocumentDataSet ", "Document");
    }
}

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

DataSet ds = new DocumentDataSet();

ds.GetXml(); // Wrong
...