Asp.Net Forums中對.Net中序列化和還原序列化的應用

來源:互聯網
上載者:User
asp.net

在Forums中,有些內容是不固定的,例如使用者資料,除了一些基本資料,可能還要有一些其他資料資訊,例如MSN、個人首頁、簽名檔等,一般對於這樣的都是每一個屬性對應於資料庫中的一個欄位。但是如果以後我們因為需要增加一些屬性,例如QQ號、Blog地址等,如果還是用這種增加資料表欄位的方法,那麼將會頻繁的修改資料庫表結構、預存程序、資料庫訪問的程式。

或許您也遇到過類似問題,看Forums中是怎麼借用.Net的序列化和還原序列化來解決的:
例如我需要在使用者資料裡面增加QQ號這個屬性,那麼我只需要在User類中增加一個屬性
public String QQIM
{
    get { return GetExtendedAttribute("QQIM"); }
    set { SetExtendedAttribute("QQIM", value); }
}
不需要修改資料庫表結構,不需要修改預存程序,連資料庫訪問的程式都不需要動。

其具體實現的主要代碼:

 

// 首先建立在User類中建立一個NameValueCollection對象,將這些擴充屬性都儲存在NameValueCollection對象中 
NameValueCollection extendedAttributes = new NameValueCollection(); 
 
// 從NameValueCollection集合中取紀錄 
public string GetExtendedAttribute(string name)     

    string returnValue = extendedAttributes[name]; 
 
    if (returnValue    == null) 
    return string.Empty; 
    else 
    return returnValue; 

 
// 設定擴充屬性的在NameValueCollection中的索引值和值 
public void SetExtendedAttribute(string    name, string value)     

    extendedAttributes[name] = value; 

 
// 將extendedAttributes對象(前面定義的用來儲存所有的使用者擴充資訊的NameValueCollection對象)序列化為記憶體流 
// 可以用來儲存到資料庫中 
public byte[] SerializeExtendedAttributes()     

 
    // 序列化對象 
    BinaryFormatter    binaryFormatter    = new BinaryFormatter(); 
 
    // 建立一個記憶體流,序列化後儲存在其中 
    MemoryStream ms    = new MemoryStream(); 
    byte[] b; 
 
    // 將extendedAttributes對象(裡面儲存了所有的使用者擴充資訊)序列化為記憶體流 
    // 
    binaryFormatter.Serialize(ms, extendedAttributes); 
 
    // 設定記憶體流的起始位置 
    // 
    ms.Position    = 0; 
         
    // 讀入到 byte 數組 
    // 
    b =    new    Byte[ms.Length]; 
    ms.Read(b, 0, b.Length); 
    ms.Close(); 
 
    return b; 

 
// 還原序列化extendedAttributes對象的內容 
// 從資料庫中讀取出來的 
public void DeserializeExtendedAttributes(byte[] serializedExtendedAttributes)  

 
    if (serializedExtendedAttributes.Length    == 0) 
    return; 
    try     
    { 
 
    BinaryFormatter    binaryFormatter    = new BinaryFormatter(); 
    MemoryStream ms    = new MemoryStream(); 
 
    // 將 byte 數組到記憶體流 
    // 
    ms.Write(serializedExtendedAttributes, 0, serializedExtendedAttributes.Length); 
 
    // 將記憶體流的位置到最開始位置 
    // 
    ms.Position    = 0; 
 
    // 還原序列化成NameValueCollection對象,建立出與原對象完全相同的副本 
    // 
    extendedAttributes = (NameValueCollection) binaryFormatter.Deserialize(ms); 
 
    ms.Close(); 
    }  
    catch    {} 
     
}
實質上序列化機制是將類的值轉化為一個一般的(即連續的)位元組流,然後就可以將該流儲存到資料庫的某個欄位中(在資料庫中forums_UserProfile表中有一個欄位“StringNameValues varbinary(7500)”)。讀取的過程對對象進行還原序列化時,建立出與原對象完全相同的副本。

注意一般這類屬性在資料庫中是不能被檢索到的,並且要這些屬效能被序列化。

更詳細內容請查閱MSDN和Asp.Net Forums源碼

 



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。