Asp.Net Forums中對.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)”)。讀取的過程對對象進行反序列化時,創建出與原對象完全相同的副本。

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

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1596208

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章