WIKI使用導(dǎo)航
站長(zhǎng)百科導(dǎo)航
站長(zhǎng)專(zhuān)題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢(qián)
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專(zhuān)題
- 云計(jì)算
- 微博營(yíng)銷(xiāo)
- 虛擬主機(jī)管理系統(tǒng)
- 開(kāi)放平臺(tái)
- WIKI程序與應(yīng)用
- 美國(guó)十大主機(jī)
SPB-設(shè)計(jì)機(jī)制-序列化字段
導(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ǔ)。
設(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ǔ):
- PropertyNames同樣存儲(chǔ)屬性名稱及在PropertyValuesString或PropertyValuesBinary中的相應(yīng)數(shù)據(jù)的存儲(chǔ)位置,并以S及B確定數(shù)據(jù)是以字符串形式還是二進(jìn)制形式存儲(chǔ);
- PropertyValuesString存儲(chǔ)屬性的字符串?dāng)?shù)據(jù);
- PropertyValuesBinary存儲(chǔ)屬性的二進(jìn)制數(shù)據(jù);
當(dāng)然Profile為了做到更加容易對(duì)Profile擴(kuò)展新的屬性,還支持在web.config中通過(guò)配置文件來(lái)增加新屬性。
二、如何使用數(shù)列化數(shù)據(jù)
- 首先確保需要使用序列化字段的實(shí)體類(lèi)從SpaceBuilder.Common.ExtendedAttributes派生。
例如:User,如下圖所示:
ExtendedAttributes主要方法如下:
在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);