国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:06:58
字體:
來源:轉載
供稿:網友

在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源碼

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兰考县| 文山县| 昌宁县| 隆化县| 京山县| 高青县| 革吉县| 黄浦区| 和田县| 高密市| 平乐县| 永昌县| 中阳县| 开鲁县| 年辖:市辖区| 论坛| 张家港市| 闵行区| 连平县| 温泉县| 凉山| 江都市| 潢川县| 平南县| 霍邱县| 乌拉特中旗| 宁河县| 宿松县| 昆山市| 宁阳县| 杂多县| 清镇市| 兴安县| 新平| 内黄县| 山阳县| 渑池县| 莒南县| 邯郸县| 青铜峡市| 洮南市|