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

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

來(lái)自站長(zhǎng)百科
跳轉(zhuǎn)至: 導(dǎo)航、? 搜索

導(dǎo)航: 上一頁(yè)


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

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

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

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

在數(shù)據(jù)庫(kù)中的存儲(chǔ)格式如下圖所示,所有需要序列化的數(shù)據(jù)全部存儲(chǔ)到PropertyNames(存儲(chǔ)屬性名稱及PropertyValues中對(duì)應(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í)體類(lèi)中定義的一個(gè)屬性名稱,“:”表示定義完畢,“S:0:4”表示在PropertyValues字段中的字符從0開(kāi)始后面4位屬于“EnableRatings”的屬性值,同理:“S:4:4”表示,從第四個(gè)字符開(kāi)始,后面5個(gè)表示“EnableTrackBacks”的屬性值,依次類(lèi)推可以獲得PropertyNames所有的字段的值。(其中S代表存儲(chǔ)格式是字符串,由于目前全部以字符串存儲(chǔ)所以不需特別關(guān)注)。

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

Spacebuilder091.jpg

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

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

Profile采用了3個(gè)字段對(duì)擴(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為了做到更加容易對(duì)Profile擴(kuò)展新的屬性,還支持在web.config中通過(guò)配置文件來(lái)增加新屬性。

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

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

例如:User,如下圖所示:

Spacebuilder093.jpg

ExtendedAttributes主要方法如下:

Spacebuilder094.jpg

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

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


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

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


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

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

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);


參考資料[ ]