WCF序列化具體應(yīng)用技巧分享
WCF已經(jīng)出現(xiàn)就為廣大開(kāi)發(fā)人員所青睞。它獨(dú)特的功能能夠幫助我們打造一個(gè)安全性極強(qiáng),可跨平臺(tái)的開(kāi)發(fā)解決方案。在這里我們就為大家詳細(xì)介紹一下其中一個(gè)比較重要的知識(shí),WCF序列化的相關(guān)應(yīng)用。
最近想做一個(gè)項(xiàng)目,考慮到需要根據(jù)用戶(hù)有可能會(huì)提供不同類(lèi)型的數(shù)據(jù)所以用到了泛型來(lái)實(shí)現(xiàn)其功能:通過(guò)RptParameters的不同方法,加入不同類(lèi)型的值,并且保存在Dictionary中,由于Dictionary中的第二個(gè)參數(shù)只能以object來(lái)包含不同類(lèi)型的值,這就需在WCF序列化在進(jìn)行的時(shí)候?yàn)槠渲该鱇nowTyp屬性,由于屬性標(biāo)示要求是具體的類(lèi)型,而類(lèi)型只能在用戶(hù)使用時(shí)才能確定,這就出現(xiàn)了矛盾。全部代碼如下,問(wèn)題出在下面代碼紅色部分,不能正常標(biāo)示泛型屬性。
- [DataContract]
- public class RptValue<T> { }
- [DataContract]
- public class RptSingleValue<T> : RptValue<T>
- {
- private T _value;
- [DataMember]
- public T Value
- {
- get { return _value; }
- set { _value = value; }
- }
- }
- [DataContract]
- public class RptFromToValue<T> : RptValue<T>
- {
- private T _fvalue;
- [DataMember]
- public T FromValue
- {
- get { return _fvalue; }
- set { _fvalue = value; }
- }
- private T _tvalue;
- [DataMember]
- public T ToValue
- {
- get { return _tvalue; }
- set { _tvalue = value; }
- }
- }
- //[KnownType(typeof(RptSingleValue))]
- //[KnownType(typeof(RptFromToValue))]
- //[KnownType(typeof(RptValue))]
- [DataContract]
- public class RptParameters
- {
- private Dictionary<string,object> _datas=new Dictionary<string,object>();
- [DataMember]
- public Dictionary<string,object> Data
- {
- get { return _datas; }
- set { _datas = value; }
- }
- public void AddSingleValue<T>(string name,T value){
- if (!this._datas.ContainsKey(name))
- {
- RptSingleValue<T> rs = new RptSingleValue<T>();
- rs.Value = value;
- this._datas.Add(name, rs);
- }
- }
- public void AddFromToValue<T>(string name,T fromValue,T toValue)
- {
- if (!this._datas.ContainsKey(name))
- {
- RptFromToValue<T> rft = new RptFromToValue<T>();
- rft.FromValue = fromValue;
- rft.ToValue = toValue;
- this._datas.Add(name,rft);
- }
- }
- }
上面代碼中紅色字體部分,是需要完善的地方,如果去掉注釋會(huì)出現(xiàn)如下圖的錯(cuò)誤傳到不能編譯通過(guò),如果不加上,WCF序列化則不能通過(guò)。
【編輯推薦】