意外的类型-序列化异常

问题描述

|| 我有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”这样琐碎的操作会导致序列化中断。这样做的原因是无法再根据旧数据验证新数据。解决方法是使用服务器/客户端期望的旧版本。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...