問題描述
手上有一行業門戶站點,每個使用者都有乙個子站點(或說模板),每個子站會有一些配置資料(如:logo,橫欄或者其它一些沒想到的東西)為了程式設計方便以及日後擴充方便,我使用直接在.aspx檔案中定義的類來儲存這些資料,同樣為了修改方便(編譯一次站的時間已經到了讓人無法接受地步),我這裡使用的是單獨的.aspx檔案(不關聯.cs檔案),配置資料會被分配給定義的類,然後將類序列化,使用是則執行反序列化,(基本上也就類似那個 profile的過程)
下面是序列化**
public static class serializationhelper
public static object deserialize(string serialdata)
catch(exception ex)
return data;}}
這裡使用了二進位制序列化,現有如下兩個檔案templateconfig.aspx跟index.aspx.
templateconfig.aspx檔案裡面**如下
頁面標籤省略.......
index.aspx檔案**如下
需要引用templateconfig.aspx頁
<%@ reference page="~/templateconfig.aspx" %>
頁面標籤省略.......
這個過程很多時候都能正常工作(現在知道,這是3種情況中的一種)
第一種:我先執行了templateconfig.aspx檔案,然後再執行index.aspx檔案發現一切正常.
第二種:我修改了一下templateconfig.aspx檔案,接著再次執行index.aspx檔案時卻出現錯誤.
單步除錯發現反序列化是正常的,但是在將反序列化後的object型別的例項轉化為temp_entproperty時出問題了,
單步除錯明明顯示object型別的例項就是temp_entproperty,但是卻不允許轉化....
第三種:有時候還會碰到反序列化錯誤,提示找不到程式集,而奇怪的是,templateconfig.aspx跟index.aspx檔案的**一行沒變動過.
問題的解決
當然這個3個問題不是同發現的,事實上這些問題是在站點測試的個把月中陸續發現的,為了避免這些情況,我一度把自定義類(如 temp_entproperty等)改成hashtable ,因為hashtable不會出現以上問題,直到今天回過頭來認真的找下原因.
好了有了上面這些知識我們現在可以解釋前面的三種情況了
第二種情況,我們修改了一下templateconfig.aspx檔案後接著執行index.aspx檔案,由於index.aspx依賴於 templateconfig.aspx檔案,因此templateconfig.aspx檔案跟index.aspx檔案都會被重新編譯生成新的程式集,問題在於 index.aspx **中
protected void page_load(object sender, eventargs e)
{asp.templateconfig_aspx.temp_entproperty properties=serializationhelper.deserialize(serialdata) as asp.templateconfig_aspx.temp_enterproperty ;
//serialdata是資料庫中的序列化後資料.
第三種情況:在應用程式重新啟動後,老的程式集會被刪除,而資料庫裡儲存的恰是舊程式集中temp_entproperty類的序列化後的資料(其中含舊程式集名稱),應次在你進行反序列化時無疑會碰到程式集無法找到問題.
問題找到了,那麼如何解決呢,其實也很簡單,如果你需要二進位制序列化帶來的高效能跟資料量少的優勢,那麼就把需要序列化的類放到固定的程式集中 (獨立建立乙個專案), 如果你想在.aspx頁面中直接定義需要序列化的類,那麼你只能使用xml序列化,因為xml序列化後的資料不保留程式集資訊.
物件序列化 二進位制序列化
物件序列化是將物件 比如類物件 轉換為二進位制資料 位元組流 反序列化是將二進位制資料還原為物件,和序列化沒有關係.關鍵字 binaryformatter 序列化 反序列化是為了保持物件的永續性.方便我們的儲存和資訊的交換.1.要序列化的物件必須比較為 serializable 2.如果有父類,該型...
二進位制序列化與XML序列化
序列化是將物件狀態轉換為可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為物件。這兩個過程結合起來,就使得資料能夠被輕鬆地儲存和傳輸。net 框架提供兩種序列化技術 二進位制序列化保持型別保真度,這對於在應用程式的不同呼叫之間保留物件的狀態很有用。例如,通過將物件序列化到剪貼簿,可在不...
示例 二進位制序列化委託
用途 將委託序列化成二進位制,一般用於遠端呼叫方法 示例 1 單元測試 testmethod public void testserializabledelegate s 呼叫原委託 string xmls s.serializebinary myactionact xmls.serializede...