久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔

SPB-設(shè)計(jì)機(jī)制-序列化字段

來自站長百科
Zhou3158討論 | 貢獻(xiàn)2010年5月26日 (三) 19:27的版本
(差異) ←上一版本 | 最后版本 (差異) | 下一版本→ (差異)
跳轉(zhuǎn)至: 導(dǎo)航、? 搜索

導(dǎo)航: 上一頁


在產(chǎn)品的不斷完善過程中或者二次開發(fā)過程中,經(jīng)常需要對現(xiàn)有的對象增加新的屬性。通常情況下,為了應(yīng)對這些變化需要在數(shù)據(jù)庫的相應(yīng)表中預(yù)留字段(當(dāng)然不預(yù)留字段就需要修改數(shù)據(jù)庫中的表、修改相應(yīng)的存儲(chǔ)過程或sql語句、修改數(shù)據(jù)訪問層…),然后在使用時(shí)賦予具體的含義。

這樣做最常見的一個(gè)結(jié)果就是使數(shù)據(jù)庫中的一些字段異?;靵y。

SpaceBuilder中,我們針對這種需求使用了序列化字段,下面介紹數(shù)據(jù)序列化的原理及如何使用數(shù)據(jù)序列化。

一、數(shù)據(jù)庫的存儲(chǔ)格式

在數(shù)據(jù)庫中的存儲(chǔ)格式如下圖所示,所有需要序列化的數(shù)據(jù)全部存儲(chǔ)到PropertyNames(存儲(chǔ)屬性名稱及PropertyValues中對應(yīng)的存儲(chǔ)位置)、PropertyValues(存儲(chǔ)屬性的具體數(shù)據(jù))兩個(gè)字段中。

先分析一下存儲(chǔ)的數(shù)據(jù),首先是PropertyNames字段 “EnableRatings:S:0:4:EnableTrackBacks:S:4:4:CommentModerationType:S:8:4:” ,“EnableRatings”其實(shí)是在實(shí)體類中定義的一個(gè)屬性名稱,“:”表示定義完畢,“S:0:4”表示在PropertyValues字段中的字符從0開始后面4位屬于“EnableRatings”的屬性值,同理:“S:4:4”表示,從第四個(gè)字符開始,后面5個(gè)表示“EnableTrackBacks”的屬性值,依次類推可以獲得PropertyNames所有的字段的值。(其中S代表存儲(chǔ)格式是字符串,由于目前全部以字符串存儲(chǔ)所以不需特別關(guān)注)。

這樣我們就利用PropertyNames、PropertyValues兩個(gè)字段存儲(chǔ)任意多個(gè)數(shù)據(jù)項(xiàng),而且不用對操作數(shù)據(jù)庫的存儲(chǔ)過程或sql語句做任何更改,這就為SpaceBuilder的數(shù)據(jù)序列化奠定了數(shù)據(jù)存儲(chǔ)基礎(chǔ)。

Spacebuilder091.jpg

設(shè)計(jì)參考

借鑒了asp.net 2.0的Profile。Profile的功能是管理用戶個(gè)人資料,而用戶個(gè)人資料在不同的項(xiàng)目中會(huì)有不同的需求(比如:年齡、性別、興趣、愛好、畢業(yè)院校…),而Profile作為一個(gè)通用的功能必須滿足這些具體的需求,它同樣采取了類似的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),如下圖所示。

Profile采用了3個(gè)字段對擴(kuò)展屬性進(jìn)行存儲(chǔ):

  1. PropertyNames同樣存儲(chǔ)屬性名稱及在PropertyValuesString或PropertyValuesBinary中的相應(yīng)數(shù)據(jù)的存儲(chǔ)位置,并以S及B確定數(shù)據(jù)是以字符串形式還是二進(jìn)制形式存儲(chǔ);
  2. PropertyValuesString存儲(chǔ)屬性的字符串?dāng)?shù)據(jù);
  3. PropertyValuesBinary存儲(chǔ)屬性的二進(jìn)制數(shù)據(jù);

Spacebuilder092.jpg

當(dāng)然Profile為了做到更加容易對Profile擴(kuò)展新的屬性,還支持在web.config中通過配置文件來增加新屬性。

二、如何使用數(shù)列化數(shù)據(jù)

  • 首先確保需要使用序列化字段的實(shí)體類從SpaceBuilder.Common.ExtendedAttributes派生。

例如:User,如下圖所示:

Spacebuilder093.jpg

ExtendedAttributes主要方法如下:

Spacebuilder094.jpg

在ExtendedAttributes的派生類我們可以方便的通過GetBool、GetInt、GetDouble、GetString、GetExtendedAttribute<T>獲取相應(yīng)的屬性值。GetSerializerData、SetSerializerData一般用于把對象存儲(chǔ)到數(shù)據(jù)庫,或從數(shù)據(jù)庫取出數(shù)據(jù)并生成對象的過程使用(參見2)。

例如,我們可以定義AvatarUrl序列化屬性,該屬性的代碼如下:


/// <summary>
        /// 用戶頭像文件名稱
        /// </summary>
        public string AvatarUrl
        {
            get { return GetExtendedAttribute("avatarUrl"); }
            set { SetExtendedAttribute("avatarUrl", value); }
       }	
  • 在數(shù)據(jù)庫的表中增加PropertyNames、PropertyValues兩個(gè)字段,一般設(shè)置PropertyNames、PropertyValues的類型為ntext。

進(jìn)行對象持久化時(shí)(即存儲(chǔ)到數(shù)據(jù)庫),需要編寫如下代碼:


     SerializerData data = user.GetSerializerData();
      myCommand.Parameters.Add("@PropertyNames", SqlDbType.NText).Value = data.Keys;
      myCommand.Parameters.Add("@PropertyValues", SqlDbType.NText).Value = data.Values;

從數(shù)據(jù)庫取出數(shù)據(jù)生成對象時(shí),一般需要編寫如下代碼:

SerializerData data = new SerializerData();
            if (dr["PropertyNames"] == DBNull.Value)
                data.Keys = "";
            else
                data.Keys = dr["PropertyNames"] as string;

            if (dr["PropertyValues"] == DBNull.Value)
                data.Values = "";
            else
                data.Values = dr["PropertyValues"] as string;
user.SetSerializerData(data);


參考資料[ ]