WCF已经出现就为广大开发人员所青睐。它独特的功能能够帮助我们打造一个安全性极强,可跨平台的开发解决方案。在这里我们就为大家详细介绍一下其中一个比较重要的知识,WCF序列化的相关应用。
最近想做一个项目,考虑到需要根据用户有可能会提供不同类型的数据所以用到了泛型来实现其功能:通过RptParameters的不同方法,加入不同类型的值,并且保存在Dictionary中,由于Dictionary中的第二个参数只能以object来包含不同类型的值,这就需在WCF序列化在进行的时候为其指明KnowTyp属性,由于属性标示要求是具体的类型,而类型只能在用户使用时才能确定,这就出现了矛盾。全部代码如下,问题出在下面代码红色部分,不能正常标示泛型属性。
- [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);
- }
- }
- }
上面代码中红色字体部分,是需要完善的地方,如果去掉注释会出现如下图的错误传到不能编译通过,如果不加上,WCF序列化则不能通过。
【编辑推荐】