WIKI使用導(dǎo)航
站長百科導(dǎo)航
站長專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計算
- 微博營銷
- 虛擬主機管理系統(tǒng)
- 開放平臺
- WIKI程序與應(yīng)用
- 美國十大主機
SPB-設(shè)計機制-序列化字段:修訂間差異
(新頁面: <span style="text-align:center; border:1px solid #000; float:right; padding:6px;"><strong>導(dǎo)航:</strong> 上一頁</span> <div style="clear:both;"></di...) ? |
無編輯摘要 ? |
||
第17行: | 第17行: | ||
這樣我們就利用PropertyNames、PropertyValues兩個字段存儲任意多個數(shù)據(jù)項,而且不用對操作數(shù)據(jù)庫的存儲過程或sql語句做任何更改,這就為SpaceBuilder的數(shù)據(jù)序列化奠定了數(shù)據(jù)存儲基礎(chǔ)。 | 這樣我們就利用PropertyNames、PropertyValues兩個字段存儲任意多個數(shù)據(jù)項,而且不用對操作數(shù)據(jù)庫的存儲過程或sql語句做任何更改,這就為SpaceBuilder的數(shù)據(jù)序列化奠定了數(shù)據(jù)存儲基礎(chǔ)。 | ||
[[Image:Spacebuilder091.jpg]] | |||
'''設(shè)計參考''': | '''設(shè)計參考''': | ||
第29行: | 第29行: | ||
#PropertyValuesBinary存儲屬性的[[二進制]]數(shù)據(jù); | #PropertyValuesBinary存儲屬性的[[二進制]]數(shù)據(jù); | ||
[[Image:Spacebuilder092.jpg]] | |||
當(dāng)然Profile為了做到更加容易對Profile擴展新的屬性,還支持在web.config中通過配置文件來增加新屬性。 | 當(dāng)然Profile為了做到更加容易對Profile擴展新的屬性,還支持在web.config中通過配置文件來增加新屬性。 | ||
第39行: | 第39行: | ||
例如:User,如下圖所示: | 例如:User,如下圖所示: | ||
[[Image:Spacebuilder093.jpg]] | |||
ExtendedAttributes主要方法如下: | ExtendedAttributes主要方法如下: | ||
[[Image:Spacebuilder094.jpg]] | |||
在ExtendedAttributes的派生類我們可以方便的通過GetBool、GetInt、GetDouble、GetString、GetExtendedAttribute<T>獲取相應(yīng)的屬性值。GetSerializerData、SetSerializerData一般用于把對象存儲到數(shù)據(jù)庫,或從數(shù)據(jù)庫取出數(shù)據(jù)并生成對象的過程使用(參見2)。 | 在ExtendedAttributes的派生類我們可以方便的通過GetBool、GetInt、GetDouble、GetString、GetExtendedAttribute<T>獲取相應(yīng)的屬性值。GetSerializerData、SetSerializerData一般用于把對象存儲到數(shù)據(jù)庫,或從數(shù)據(jù)庫取出數(shù)據(jù)并生成對象的過程使用(參見2)。 |
2010年5月26日 (三) 19:27的最新版本
導(dǎo)航: 上一頁
在產(chǎn)品的不斷完善過程中或者二次開發(fā)過程中,經(jīng)常需要對現(xiàn)有的對象增加新的屬性。通常情況下,為了應(yīng)對這些變化需要在數(shù)據(jù)庫的相應(yīng)表中預(yù)留字段(當(dāng)然不預(yù)留字段就需要修改數(shù)據(jù)庫中的表、修改相應(yīng)的存儲過程或sql語句、修改數(shù)據(jù)訪問層…),然后在使用時賦予具體的含義。
這樣做最常見的一個結(jié)果就是使數(shù)據(jù)庫中的一些字段異常混亂。
在SpaceBuilder中,我們針對這種需求使用了序列化字段,下面介紹數(shù)據(jù)序列化的原理及如何使用數(shù)據(jù)序列化。
一、數(shù)據(jù)庫的存儲格式
在數(shù)據(jù)庫中的存儲格式如下圖所示,所有需要序列化的數(shù)據(jù)全部存儲到PropertyNames(存儲屬性名稱及PropertyValues中對應(yīng)的存儲位置)、PropertyValues(存儲屬性的具體數(shù)據(jù))兩個字段中。
先分析一下存儲的數(shù)據(jù),首先是PropertyNames字段 “EnableRatings:S:0:4:EnableTrackBacks:S:4:4:CommentModerationType:S:8:4:” ,“EnableRatings”其實是在實體類中定義的一個屬性名稱,“:”表示定義完畢,“S:0:4”表示在PropertyValues字段中的字符從0開始后面4位屬于“EnableRatings”的屬性值,同理:“S:4:4”表示,從第四個字符開始,后面5個表示“EnableTrackBacks”的屬性值,依次類推可以獲得PropertyNames所有的字段的值。(其中S代表存儲格式是字符串,由于目前全部以字符串存儲所以不需特別關(guān)注)。
這樣我們就利用PropertyNames、PropertyValues兩個字段存儲任意多個數(shù)據(jù)項,而且不用對操作數(shù)據(jù)庫的存儲過程或sql語句做任何更改,這就為SpaceBuilder的數(shù)據(jù)序列化奠定了數(shù)據(jù)存儲基礎(chǔ)。
設(shè)計參考:
借鑒了asp.net 2.0的Profile。Profile的功能是管理用戶個人資料,而用戶個人資料在不同的項目中會有不同的需求(比如:年齡、性別、興趣、愛好、畢業(yè)院?!?,而Profile作為一個通用的功能必須滿足這些具體的需求,它同樣采取了類似的數(shù)據(jù)存儲結(jié)構(gòu),如下圖所示。
Profile采用了3個字段對擴展屬性進行存儲:
- PropertyNames同樣存儲屬性名稱及在PropertyValuesString或PropertyValuesBinary中的相應(yīng)數(shù)據(jù)的存儲位置,并以S及B確定數(shù)據(jù)是以字符串形式還是二進制形式存儲;
- PropertyValuesString存儲屬性的字符串?dāng)?shù)據(jù);
- PropertyValuesBinary存儲屬性的二進制數(shù)據(jù);
當(dāng)然Profile為了做到更加容易對Profile擴展新的屬性,還支持在web.config中通過配置文件來增加新屬性。
二、如何使用數(shù)列化數(shù)據(jù)
- 首先確保需要使用序列化字段的實體類從SpaceBuilder.Common.ExtendedAttributes派生。
例如:User,如下圖所示:
ExtendedAttributes主要方法如下:
在ExtendedAttributes的派生類我們可以方便的通過GetBool、GetInt、GetDouble、GetString、GetExtendedAttribute<T>獲取相應(yīng)的屬性值。GetSerializerData、SetSerializerData一般用于把對象存儲到數(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兩個字段,一般設(shè)置PropertyNames、PropertyValues的類型為ntext。
進行對象持久化時(即存儲到數(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ù)生成對象時,一般需要編寫如下代碼:
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);