WCF,这个异常啥原因?

dvf4r4t 2015-10-25 09:44:00
格式化程序尝试对消息反序列化时引发异常: 尝试对参数 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出了问题
...全文
397 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不同类型,设置不同服务方法。就这么简单。 真正聪明的开发人员,是在整体效率上直接体现出来的,而对于皮毛式的格式则表现出非常务实、演化、无病态洁癖的特点。如果你整天都把大把时间消耗在皮毛的格式的各种挑刺儿上,可以看出一点就是你的实质其实还没有多少深度,以至于让你可以奢侈地玩儿皮毛。
  • 打赏
  • 举报
回复
不同类型,要定义不同的服务。否则照你的说法,难不成用一个“万能”服务方法、一个参数,就把成百上千的服务给包括了? 所谓“万能的”服务,其实是自欺欺人的。搞这个东西的人往往结果是“万万不能的”,你自己的经历就证明了这一点。
ajianchina 2015-10-26
  • 打赏
  • 举报
回复
好办,不要纠结,可能出现的几种类型,就多加几个成员而已。到时候个别成员即便没有复制没有值不妨碍序列化的。 如果你的object只可能是Double或List<Double>,那就声明成List<Double>,如有只需传一个Double值,那就用只含一条数据的List<Double>,这样就行了,跟你上次问的关于传datagridview概念是一样的,还记得吗?
dvf4r4t 2015-10-26
  • 打赏
  • 举报
回复
引用 12 楼 ajianchina 的回复:
像你这种情况,你可以将几个object都声明为string,传之前转为字符串,接收到后再通过类型转换为你要的格式,这样没问题。 但在序列化跟反序列化过程中,一定要明确为已知类型。 你之前有个别几次成功,应该内部都是传的string,如果想让object能传过去,也可以,需要通过另一个类进行中转,我个人觉得没必要,并且根本无需看你的结果,只需看你的契约跟成员声明,就知道必然要出错。
完了,咋整,上面的Object BasisJiangJin,实际类型有几种可能,要么是Double类型,要么是List<Double>类型,按照你的方法,在传输之前object都声明为string,行不通诶.........
ajianchina 2015-10-26
  • 打赏
  • 举报
回复
像你这种情况,你可以将几个object都声明为string,传之前转为字符串,接收到后再通过类型转换为你要的格式,这样没问题。 但在序列化跟反序列化过程中,一定要明确为已知类型。 你之前有个别几次成功,应该内部都是传的string,如果想让object能传过去,也可以,需要通过另一个类进行中转,我个人觉得没必要,并且根本无需看你的结果,只需看你的契约跟成员声明,就知道必然要出错。
ajianchina 2015-10-26
  • 打赏
  • 举报
回复
引用 9 楼 dvf4r4t 的回复:
好吧,就算是object造成的吧,有什么解决办法吗?
引用 10 楼 dvf4r4t 的回复:
含有来自映射到名称“http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfstring”的类型的数据。 这是什么意思呢?ArrayOfstring是什么啊,是不是指的String[]?又怎么啦?
不是就算是object造成的,而是错误已经锁定就是他造成的。 通过ArrayOfstring看得出来你是传的可能是一个列表集合,列表集合数据契约格式时ArrayOf+集合中包含的元素类型,你将其声明为了object,不能正常将object内的string反序列化,或是你传过去的object数据集合内部不全部是string。 你不要在这上面创新,该问题需要严格按照官方说明的数据类型事先声明,没其他什么事。
dvf4r4t 2015-10-26
  • 打赏
  • 举报
回复
含有来自映射到名称“http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfstring”的类型的数据。 这是什么意思呢?ArrayOfstring是什么啊,是不是指的String[]?又怎么啦?
qq_32331575 2015-10-26
  • 打赏
  • 举报
回复
进来学习一下~~~~
dvf4r4t 2015-10-26
  • 打赏
  • 举报
回复
引用 6 楼 ajianchina 的回复:
使用DataContract来声明数据契约,要求以明确参与(DataMember)标识哪些成员需要序列化,并且要求参与成员为已知类型,你看看你那几个object。 提示告诉你考虑使用DataContractResolver在序列化或反序列化时将其成员映射具体的已知类型。 虽然可以通过一个中间类型转换的方式传递object,但你能明确中间类型倒不如直接在成员中明确object的具体类型。 亦或你的该成员无需加入序列化,你可以而将该数据契约以SerializableAttribute的方式声明,该成员加上NoSerialized来明确标识他不参序列化。
我也看过MSDN,是说过声明为object类型的成员,不是已知类型,但我测试过,声明为object的成员能够传输,没有报错。 好吧,就算是object造成的吧,有什么解决办法吗? 中间类型?是不是把该成员放到一个其他类中,这不是一样吗,反正最终深入下去,还是有object。 你说的该成员不需要序列化吗?不序列化,怎么能传输呢?
df4tth5 2015-10-26
  • 打赏
  • 举报
回复
引用 19 楼 ajianchina 的回复:
这么快就得出结论了? 你是hosting引用的service,你客户端是更新了,但他是通过hosting更新的,但你确定hosting的引用也更新了吗? 你不妨打开客户端的代理类看看字段是否被更新。
我没看见,SingleData类里面还有个Object
ajianchina 2015-10-26
  • 打赏
  • 举报
回复
这么快就得出结论了? 你是hosting引用的service,你客户端是更新了,但他是通过hosting更新的,但你确定hosting的引用也更新了吗? 你不妨打开客户端的代理类看看字段是否被更新。
dvf4r4t 2015-10-26
  • 打赏
  • 举报
回复
终于发现,这不是Object造成的原因,因为刚才我已经作了修改,上面有两个Object的成员,其中一个已被我删除,另一个改成了String类型。 重新生成、客户端更新服务引用,单击按钮,结果还是出现上面的异常信息....... 这是什么原因呢?
angel6709 2015-10-26
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
不要写 public object DataDetail,要声明一个强类型的类型。
而且要有knowntype
threenewbee 2015-10-25
  • 打赏
  • 举报
回复
反序列化程序无法识别任何映射到此名称的类型 说的很清楚,你的类型不清楚
  • 打赏
  • 举报
回复
这么说吧你觉得你哪个地方最可能放string[]
ajianchina 2015-10-25
  • 打赏
  • 举报
回复
使用DataContract来声明数据契约,要求以明确参与(DataMember)标识哪些成员需要序列化,并且要求参与成员为已知类型,你看看你那几个object。 提示告诉你考虑使用DataContractResolver在序列化或反序列化时将其成员映射具体的已知类型。 虽然可以通过一个中间类型转换的方式传递object,但你能明确中间类型倒不如直接在成员中明确object的具体类型。 亦或你的该成员无需加入序列化,你可以而将该数据契约以SerializableAttribute的方式声明,该成员加上NoSerialized来明确标识他不参序列化。
dvf4r4t 2015-10-25
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
除了singledata,其它的复杂实体定义呢,另外你的object zhongjainstatus放的又是什么?wcf只能识别基础类型,其它的你需要指定knowtype
只有singledata啊,没有其他的了,其他的都是枚举。zhongjainstatus有可能是Bool,有可能是String
  • 打赏
  • 举报
回复
除了singledata,其它的复杂实体定义呢,另外你的object zhongjainstatus放的又是什么?wcf只能识别基础类型,其它的你需要指定knowtype
  • 打赏
  • 举报
回复
除了singledata,其它的复杂实体定义呢,另外你的object zhongjainstatus放的又是什么?wcf只能识别基础类型,其它的你需要指定knowtype
  • 打赏
  • 举报
回复
要声明一个强类型的字段
加载更多回复(1)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧