網站開發

          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 風雨兼程 閱讀(282) 評論(0)  編輯  收藏 所屬分類: Asp.net 2.0

          主站蜘蛛池模板: 阿拉善左旗| 沅陵县| 呈贡县| 金平| 吉安县| 天祝| 留坝县| 铜陵市| 卢龙县| 台中市| 达尔| 子洲县| 浦县| 霞浦县| 关岭| 香格里拉县| 咸阳市| 蓝山县| 东乡族自治县| 峨眉山市| 福清市| 湖南省| 蓝田县| 兴和县| 呼玛县| 安顺市| 林芝县| 奈曼旗| 宁海县| 得荣县| 喜德县| 华蓥市| 商城县| 河池市| 即墨市| 锡林郭勒盟| 余姚市| 阿荣旗| 简阳市| 龙井市| 东乌珠穆沁旗|