2012-01-19 85 views
0

我有一個XML文檔,我想將它存儲在會話中,所以在每次回發後,我不需要再次從其物理路徑加載它。我們正在使用狀態服務器。我可以在會話中存儲xmlDocument對象嗎?如何執行seralization?

當我試圖將其存儲在會話我得到一個錯誤:

異常詳細信息:System.Runtime.Serialization.SerializationException:在大會「的System.Xml類型「System.Xml.XmlDocument」,版本爲2.0 .0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未標記爲可序列化。

我的代碼是這樣的:

串resumeSection =的String.Empty;

resumeSection = resume.GetXMLSection(1) 

XmlDocument xmlDoc = new XmlDocument(); 

xmlDoc.LoadXml(resumeSection); 

Session["USERXML"] = xmloc; 

如何做seralization?

因爲我得到以下錯誤 無法序列化會話狀態。在'StateServer'和'SQLServer'模式下,ASP.NET將序列化會話狀態對象,因此不允許使用不可序列化的對象或MarshalByRef對象。如果自定義會話狀態存儲在「自定義」模式下進行類似的序列化,則適用相同的限制。

回答

1

當你存儲在會話應當標明[serealizable]所以你應該把它保存到會話或視圖狀態之前序列化你的對象的任何對象。

說實話,你真不該把複雜的類型分爲會話狀態 你應該只存儲簡單類型或重量輕商業實體 不喜歡XmlDocument對象。

我認爲最好的方法是使用自定義序列化。如果 類不太大,則可以將XmlDocument持久化爲一個字符串,然後在序列化實例時僅存儲該值。然後,當 反序列化時,您可以從SerializationInfo實例中抽取它。

你可以從here

this過去快速獲取想法SO後也可以回答你的問題在一定程度上

+0

如何做到系列化befor將它存儲會話變量? –

+0

看看我在回答http://rtur.net/blog/post/2008/03/16/Serializing-XMLDocument-to-binary-format提供的鏈接。aspx – Devjosh

+0

以那裏顯示的方式準備xmlDocument,然後按照您分配的類似方式將新準備的xmlDocument對象分配給會話 – Devjosh

0

我知道這2歲,但我面臨同樣的問題我自己,因爲我找到了解決方案,我想與你分享。 Devjosh是對的,我們不應該在會話中存儲複雜的對象,但有時非常有用,所以很高興知道有一個解決方案。

我注意到如果你存儲像xml/dataset/class這樣的對象,你可能會遇到這個錯誤。我試圖將它作爲一個通用對象存儲,似乎工作。在存儲數據集的相同代碼中,我有錯誤,通過存儲在類似的通用對象中,工作正常。

下面是一個簡單的例子:

public static void InsertSessionObject(string item, object obj) 
    { 
     HttpContext.Current.Session.Add(item, obj); 
    } 

    public static object GetSessionObject(string item) 
    { 
     return HttpContext.Current.Session[item]; 
    } 

    public static void RemoveSessionObject(string item) 
    { 
     HttpContext.Current.Session.Remove(item); 
    } 

    DataSet lastResults = GetDatasetResults(); 

    InsertSessionObject("myDataset", lastResults); 

    lastResults = (DataSet)GetSessionObject("myDataset"); 

    RemoveSessionObject("myDataset"); 
相關問題