如何解决意外的类型-序列化异常
|| 我有WCF服务。 正常操作将使服务器进行一些处理,以通过回调将已填充的XactTaskIn对象返回给客户端。我的工作正常。 我的问题是,当我尝试将returnData变量设置为已填充的XactException并尝试通过回调将XactTaskIn发送回客户端时,会引发以下异常。 例外-\“ Type \'XactException \'与 数据合同名称 \'XactException:http://schemas.datacontract.org/2004/07/ \' 不是预期的。考虑使用 DataContractResolver或添加任何类型 列表的静态未知 已知类型-例如,通过使用 KnownTypeAttribute属性或 将它们添加到已知类型列表中 传递给DataContractSerializer。\“ (System.Runtime.Serialization.SerializationException)异常 消息= \“类型\'XactException \'与 数据合同名称 \'XactException:http://schemas.datacontract.org/2004/07/ \' 不是预期的。考虑使用 DataContractResolver或添加任何类型 列表的静态未知 已知类型-例如,通过使用 KnownTypeAttribute属性或 将它们添加到已知类型列表中 传递给DataContractSerializer。\“, 异常类型= \“ System.Runtime.Serialization.SerializationException \” 这是XactTaskIn类[DataContract]
public class XactTaskIn
{
[DataMember]
public DateTime timeOut;
[DataMember]
public DateTime timeIn;
[DataMember]
public string name;
[DataMember]
public string responseTo;
[DataMember]
public String moduleFromName;
[DataMember]
public String moduleFromType;
[DataMember]
public String methodFromName;
[DataMember]
public object[] originalInputs;
[DataMember]
public String returnMethodToCall;
[DataMember]
public String returnModuleToCall;
[DataMember]
public object returnData;
public XactTaskIn(DateTime timeOut,DateTime timeIn,string name,string responseTo,String moduleFromName,String moduleFromType,String methodFromName,object[] originalInputs,String returnMethodToCall,String returnModuleToCall,object returnData)
{
this.timeOut = timeOut;
this.timeIn = timeIn;
this.name = name;
this.responseTo = responseTo;
this.moduleFromName = moduleFromName;
this.moduleFromType = moduleFromType;
this.methodFromName = methodFromName;
this.originalInputs = originalInputs;
this.returnMethodToCall = returnMethodToCall;
this.returnModuleToCall = returnModuleToCall;
this.returnData = returnData;
}
}
这是XactException类:
[DataContract]
public class XactException
{
[DataMember]
string message;
public XactException(string message)
{
this.message = message;
// Add implementation.
}
}
更新:
好的,所以丹尼尔的评论对我有所帮助。
现在看来,服务器正在向客户端发送回调,但是客户端抛出以下异常。
捕获:“格式化程序尝试反序列化时引发异常
消息:出现错误,而
试图反序列化参数
http://tempuri.org/:taskIn。的
InnerException消息为\'错误
第1行的位置960。元素
\'http://schemas.datacontract.org/2004/07/:returnData \'
包含来自映射到的类型的数据
名字
\'http://schemas.datacontract.org/2004/07/:XactException \'。
解串器不了解
映射到该名称的任何类型。
考虑使用DataContractResolver
或添加对应于
\'XactException \'到已知列表
类型-例如,通过使用
KnownTypeAttribute属性或按
将其添加到已知类型列表中
传递给DataContractSerializer。
请参阅InnerException了解更多信息
细节。\”
(System.ServiceModel.Dispatcher.NetDispatcherFaultException)异常
消息= \“格式化程序将
尝试反序列化时发生异常
消息:出现错误,而
试图反序列化参数
http://tempuri.org/:taskIn。的
InnerException消息为\'错误
第1行的位置960。元素
\'http://schemas.datacontract.org/2004/07/:returnData \'
包含来自映射到的类型的数据
名字
\'http://schemas.datacontract.org/2004/07/:XactException \'。
解串器不了解
映射到该名称的任何类型。
考虑使用DataContractResolver
或添加对应于
\'XactException \'到已知列表
类型-例如,通过使用
KnownTypeAttribute属性或按
将其添加到已知类型列表中
传递给DataContractSerializer。
请参阅InnerException了解更多信息
details。\“,异常类型=
\“ System.ServiceModel.Dispatcher.NetDispatcherFaultException \”
解决方法
在你班上
[DataContract]
public class XactTaskIn
您具有返回对象的属性:
[DataMember]
public object[] originalInputs;
[DataMember]
public object returnData;
WCF需要提前知道那里可能存在哪些类型,以便它可以(通过WSDL)告诉客户端所有类型是什么。对于任何/所有非“ native”类型(不是int,string,DateTime等的任何类型),您将需要为可能在这些对象属性中传递回的每种可能的类型添加[KnownType]属性。 :
[KnownType(typeof(XactException))]
[KnownType(typeof(...))]
[KnownType(typeof(...))]
[DataContract]
public class XactTaskIn
这样,当WCF为该服务构建WSDL时,它将知道将XactException添加到数据类型列表中,并且序列化程序也将知道要查找那些类。
边注;如果您的客户端是使用SrvUtil,服务参考构建的,或者是通过WSDL生成的,则需要在添加[KnownType]属性之后重新构建客户端!
,您的客户期望的是XactTaskIn而不是XactException。
您需要更改XactTaskIn才能将异常对象传递回客户端。
删除您的异常数据合同,并将XactException类型作为数据成员添加到XactTaskIn类中
, 序列化异常发生在数据已更改时,例如,将字段名称从“ 5”更改为“ 6”这样琐碎的操作会导致序列化中断。这样做的原因是无法再根据旧数据验证新数据。解决方法是使用服务器/客户端期望的旧版本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。