Могу ли я сохранить объект xmlDocument во ViewState? - PullRequest
3 голосов
/ 23 декабря 2009

У меня есть один XML-документ, который я хочу сохранить в ViewState, поэтому при каждом возвращении мне не нужно загружать его с его физического пути снова. Я также не хочу хранить его в SessionState.

когда я пытался стереть его во ViewState, я получаю сообщение об ошибке:

Сведения об исключении: System.Runtime.Serialization.SerializationException: Тип 'System.Xml.XmlDocument' в сборке 'System.Xml, версия = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089' не помечен как сериализуемый.

моя собственность выглядит примерно так:

private XmlDocument MyDocument      {
        get
        {
            object viwObj = ViewState["MyDocument"];
            if (viwObj != null)
                return (XmlDocument)viwObj;

            XmlDocument xmlDoc =  GetMyDocument();
            ViewState["MyDocument"] = xmlDoc;

            return xmlDoc;
        }
    }

Как я могу сделать сериализуемый документ XML таким образом?

спасибо

Ответы [ 2 ]

4 голосов
/ 23 декабря 2009

Вы можете сериализовать ваш XmlDocument в строку XML и сохранить эту строку в ViewState.

Сериализация:

using (var sw = new StringWriter())
using (var xw = new XmlTextWriter(sw))
{
    xmlDoc.WriteTo(xw);
}

ViewState["MyDocument"] = sw.ToString()

Десериализация:

var xmlDoc = new XmlDocument();
xmlDoc.LoadXml((string) ViewState["MyDocument"]);

Этот тип сериализации в действительности не вписывается в свойство get / set, поэтому вы, скорее всего, захотите переопределить методы SaveViewState() и LoadViewState() вашего пользовательского элемента управления / страницы и добавить логику сериализации / десериализации в это.

0 голосов
/ 23 декабря 2009

Вы всегда можете просто преобразовать ваш XML-документ в его строковое представление и сохранить / загрузить его в viewstate. Надеюсь, это сравнительно небольшой документ?

...