<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    網站開發

    asp.net
    隨筆 - 30, 文章 - 0, 評論 - 9, 引用 - 0
    數據加載中……

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

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

    posted on 2006-11-07 14:27 風雨兼程 閱讀(281) 評論(0)  編輯  收藏 所屬分類: Asp.net 2.0

    主站蜘蛛池模板: 亚洲中文字幕无码一去台湾| 日产亚洲一区二区三区| 亚洲欧美国产国产综合一区| 一级毛片免费毛片一级毛片免费 | 成人区精品一区二区不卡亚洲| 最近中文字幕高清免费中文字幕mv| 亚洲国产精品成人久久| 最近免费mv在线观看动漫| 亚洲国产AV无码专区亚洲AV| 日本免费一区二区久久人人澡| 亚洲网址在线观看你懂的| 免费在线视频你懂的| 亚洲综合色一区二区三区| 黄网址在线永久免费观看 | 无码欧精品亚洲日韩一区| 免费精品无码AV片在线观看| 亚洲国产精品成人综合久久久| 国产成人免费网站| 老牛精品亚洲成av人片| 久久亚洲国产成人精品无码区| a级毛片免费全部播放无码| 18gay台湾男同亚洲男同| 好吊妞视频免费视频| 成人午夜免费视频| 国产AV无码专区亚洲AV毛网站| 18女人腿打开无遮掩免费| 亚洲色偷偷偷综合网| 国产精品亚洲不卡一区二区三区| 免费国产叼嘿视频大全网站| 久久亚洲最大成人网4438| 免费A级毛片无码久久版| 免费日本一区二区| 亚洲av永久无码| 在线A亚洲老鸭窝天堂| 波多野结衣中文字幕免费视频| 看Aⅴ免费毛片手机播放| 亚洲AV人无码综合在线观看| 国产精品视频免费一区二区 | 又大又硬又粗又黄的视频免费看| 亚洲AV无码乱码国产麻豆穿越 | 免费无码av片在线观看|