WCF 传输Dictionary<string, object>数据问题

来源:互联网 发布:类似花瓣的软件 编辑:程序博客网 时间:2024/05/16 11:47

本文传输的数据类为:

 ManageRelationInfo GetRelationinfo(string userid, int target_type, int count, out bool isfinished);

 其中 ManageRelationInfo 实体类为:

[KnownType(typeof(MongoDB.Bson.ObjectId))] public class ManageRelationInfo    {        [DataMember]         public MongoDB.Bson.ObjectId _id;        [DataMember]         public ObjectId target_id { get; set; }        private List<Dictionary<string, object>> _target_id2_list;        [DataMember]        public List<Dictionary<string, object>> target_id2_list        {            get{ return _target_id2_list;}            set{_target_id2_list = value;}        }        [DataMember]         public string remark { get; set; }        [DataMember]         public string bak_field { get; set; }        [DataMember]         public int comment_count { get; set; }        /// <summary>        ///自定义object 对象 目的让 WCF 序列化 Dictionary<string, object>  中的object 对象,从而通过        ///KnownType 识别其类型        /// </summary>        [DataMember]        [BsonIgnore]        public object obj { get; set; }    }

在 客户端接收数据的时候 发现报错 “***这可能是由于服务终结点绑定未使用 HTTP 协议造成的***”

我一开始认为 是由于传输数据量过大的问题 结果测试发现不是,原因是 WCF 无法序列化Dictionary<string, object> 包含object 类型的数据。

通过收集网上的资料以及解决办法,终于解决了这个问题。

我的Dictionary<string, object> 包含 Dictionary<string, int>,Dictionary<string, string>,Dictionary<string, ObjectId>三种类型的,其中string,int WCF肯定都能序列化的,我都测试过了。所以 只要在实体类上面声明下

[KnownType(typeof(MongoDB.Bson.ObjectId))] 
这个类型 让 WCF识别这种类型的数据。

接着就是 在实体类中添加 object 属性 让WCF明确知道Dictionary<string, object> 中的object 的存在

 [DataMember] public object obj { get; set; }

以上是我个人理解,新手勿喷。。。