当前位置: 代码迷 >> C# >> WCF,这个错误啥原因
  详细解决方案

WCF,这个错误啥原因

热度:666   发布时间:2016-04-28 08:42:17.0
WCF,这个异常啥原因?
格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: ListTouZhuResult。
InnerException 消息是“元素“http://schemas.datacontract.org/2004/07/Contracts:DataDetail”
含有来自映射到名称“http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfstring”的类型的数据。
反序列化程序无法识别任何映射到此名称的类型。请考虑使用 DataContractResolver,或将与“ArrayOfstring”对应的类型添加到已知类型的列表。
例如,您可以使用 KnownTypeAttribute 特性,或者将相应类型添加到传递给 DataContractSerializer 的已知类型列表。”。有关详细信息,请参见 InnerException。


ListTouZhuResult类如下:

[DataContract] 
public class TouZhuResult
    {
        public TouZhuResult()
        {
            ZhongJiangStatus = "aaa";
            BuyMode = Models.ClassShengYue.BuyMode.dfdf;
        }
        [DataMember]
        public string TouZhuQiShu { get; set; }
        [DataMember]
        public DateTime TouZhuDateTime { get; set; }
        [DataMember]
        public Models.ClassShengYue.CaiPiaoGenre CaiPiaoGenre { get; set; }
        [DataMember]
        public string StCaiPiaoGenre { get; set; }
        [DataMember]
        public Models.ClassShengYue.PlaySort PlaySort { get; set; }
        [DataMember]
        public string StPlaySort { get; set; }
        [DataMember]
        public List<SingleData> TouZhuDetail { get; set; }
        [DataMember]
        public string TouZhuDetailSt { get; set; }
        [DataMember]
        public int ZhuShu { get; set; }
        [DataMember]
        public double TouZhuMoney { get; set; }
        [DataMember]
        public object BasisJiangJin { get; set; }
        [DataMember]
        public string BonusMode { get; set; }
        [DataMember]
        public ClassShengYue.AssignmentType TouZhuAssignmentType;
        [DataMember]
        public int Multiple { get; set; }
        [DataMember]
        public List<string> SelectedWeiShu { get; set; }
        [DataMember]
        public Models.ClassShengYue.BuyMode BuyMode { get; set; }
        [DataMember]
        public object ZhongJiangStatus { get; set; }
        [DataMember]
        public double CurrentRebateNumber { get; set; }
        [DataMember]
        public int RebateBonus { get; set; }
        [DataMember]
        public DateTime RevocationDateTime { get; set; }
    }
[DataContract] 
public class SingleData
{
    [DataMember]
    public object DataDetail;
    [DataMember]
    public List<string> DataSelectWeiShu;
    [DataMember]
    public double DataBasisJiangJin;
}

操作契约:

 [OperationContract]
 void Buy(string UserName, bool IsZhuiHao, List<TouZhuResult> ListTouZhuResult);

ClassShengYue类处于公共dll中,上面了使用了其中的几个枚举。SingleData是一个数据契约。

这个异常是什么原因呢?只看出可能是TouZhuResult出了问题
------解决思路----------------------
不要写 public object DataDetail,要声明一个强类型的类型。
------解决思路----------------------
要声明一个强类型的字段
------解决思路----------------------
除了singledata,其它的复杂实体定义呢,另外你的object zhongjainstatus放的又是什么?wcf只能识别基础类型,其它的你需要指定knowtype
------解决思路----------------------
除了singledata,其它的复杂实体定义呢,另外你的object zhongjainstatus放的又是什么?wcf只能识别基础类型,其它的你需要指定knowtype
------解决思路----------------------
使用DataContract来声明数据契约,要求以明确参与(DataMember)标识哪些成员需要序列化,并且要求参与成员为已知类型,你看看你那几个object。
提示告诉你考虑使用DataContractResolver在序列化或反序列化时将其成员映射具体的已知类型。
虽然可以通过一个中间类型转换的方式传递object,但你能明确中间类型倒不如直接在成员中明确object的具体类型。
亦或你的该成员无需加入序列化,你可以而将该数据契约以SerializableAttribute的方式声明,该成员加上NoSerialized来明确标识他不参序列化。
------解决思路----------------------
这么说吧你觉得你哪个地方最可能放string[]
------解决思路----------------------
反序列化程序无法识别任何映射到此名称的类型
说的很清楚,你的类型不清楚
------解决思路----------------------
引用:
好吧,就算是object造成的吧,有什么解决办法吗?

引用:
含有来自映射到名称“http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfstring”的类型的数据。
这是什么意思呢?ArrayOfstring是什么啊,是不是指的String[]?又怎么啦?

不是就算是object造成的,而是错误已经锁定就是他造成的。
通过ArrayOfstring看得出来你是传的可能是一个列表集合,列表集合数据契约格式时ArrayOf+集合中包含的元素类型,你将其声明为了object,不能正常将object内的string反序列化,或是你传过去的object数据集合内部不全部是string。
你不要在这上面创新,该问题需要严格按照官方说明的数据类型事先声明,没其他什么事。
------解决思路----------------------
像你这种情况,你可以将几个object都声明为string,传之前转为字符串,接收到后再通过类型转换为你要的格式,这样没问题。
但在序列化跟反序列化过程中,一定要明确为已知类型。
你之前有个别几次成功,应该内部都是传的string,如果想让object能传过去,也可以,需要通过另一个类进行中转,我个人觉得没必要,并且根本无需看你的结果,只需看你的契约跟成员声明,就知道必然要出错。
------解决思路----------------------
好办,不要纠结,可能出现的几种类型,就多加几个成员而已。到时候个别成员即便没有复制没有值不妨碍序列化的。
如果你的object只可能是Double或List<Double>,那就声明成List<Double>,如有只需传一个Double值,那就用只含一条数据的List<Double>,这样就行了,跟你上次问的关于传datagridview概念是一样的,还记得吗?
------解决思路----------------------
不同类型,要定义不同的服务。否则照你的说法,难不成用一个“万能”服务方法、一个参数,就把成百上千的服务给包括了?

所谓“万能的”服务,其实是自欺欺人的。搞这个东西的人往往结果是“万万不能的”,你自己的经历就证明了这一点。
------解决思路----------------------
不同类型,设置不同服务方法。就这么简单。

真正聪明的开发人员,是在整体效率上直接体现出来的,而对于皮毛式的格式则表现出非常务实、演化、无病态洁癖的特点。如果你整天都把大把时间消耗在皮毛的格式的各种挑刺儿上,可以看出一点就是你的实质其实还没有多少深度,以至于让你可以奢侈地玩儿皮毛。
------解决思路----------------------
引用:
不要写 public object DataDetail,要声明一个强类型的类型。

而且要有knowntype
------解决思路----------------------
这么快就得出结论了?
你是hosting引用的service,你客户端是更新了,但他是通过hosting更新的,但你确定hosting的引用也更新了吗?
你不妨打开客户端的代理类看看字段是否被更新。
------解决思路----------------------
进来学习一下~~~~
  相关解决方案