在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源碼
|
新聞熱點
疑難解答
圖片精選