Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF抽象基类,其抽象类型的复杂集合未包含在服务响应中进行反序列化_C#_Wcf_Wcf Binding - Fatal编程技术网

C# WCF抽象基类,其抽象类型的复杂集合未包含在服务响应中进行反序列化

C# WCF抽象基类,其抽象类型的复杂集合未包含在服务响应中进行反序列化,c#,wcf,wcf-binding,C#,Wcf,Wcf Binding,我们正在为应用程序中的所有响应DTO使用基类。该类具有以下签名: [Serializable] public abstract class ResponseBase { public bool Successful { get; set; } public List<ResponseMessage> Messages { get; set; } //...Other code... } 具体版本如下: [Serializable] public class

我们正在为应用程序中的所有响应DTO使用基类。该类具有以下签名:

[Serializable]
public abstract class ResponseBase
{
    public bool Successful { get; set; }
    public List<ResponseMessage> Messages { get; set; }

    //...Other code...
}
具体版本如下:

[Serializable]
public class DebugMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.Debug; } }
}
[Serializable]
public class InfoMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.Info; } }
}
[Serializable]
public class ValidationMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.Validation; } }
}
[Serializable]
public class WarnMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.Warn; } }
}
[Serializable]
public class RecoverableFaultMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.RecoverableFault; } }
}
[Serializable]
public class FatalFaultMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.FatalFault; } }
}
所有DTO响应对象都从ResponseBase继承,但即使在WCF合约上有以下ServiceKnownTypes

[ServiceKnownType(typeof(ResponseBase))]
[ServiceKnownType(typeof(ResponseMessage))]
[ServiceKnownType(typeof(List<ResponseMessage>))]
[ServiceKnownType(typeof(DebugMessage))]
[ServiceKnownType(typeof(InfoMessage))]
[ServiceKnownType(typeof(ValidationMessage))]
[ServiceKnownType(typeof(WarnMessage))]
[ServiceKnownType(typeof(RecoverableFaultMessage))]
[ServiceKnownType(typeof(FatalFaultMessage))]
[ServiceKnownType(typeof(List<DebugMessage>))]
[ServiceKnownType(typeof(List<InfoMessage>))]
[ServiceKnownType(typeof(List<ValidationMessage>))]
[ServiceKnownType(typeof(List<WarnMessage>))]
[ServiceKnownType(typeof(List<RecoverableFaultMessage>))]
[ServiceKnownType(typeof(List<FatalFaultMessage>))]
[ServiceKnownType(typeof(ResponseBase))]
[ServiceKnownType(类型(响应消息))]
[ServiceKnownType(类型(列表))]
[ServiceKnownType(类型(调试消息))]
[ServiceKnownType(类型(信息消息))]
[ServiceKnownType(类型(验证消息))]
[ServiceKnownType(类型(警告消息))]
[ServiceKnownType(typeof(RecoverableFaultMessage))]
[ServiceKnownType(类型(FatalFaultMessage))]
[ServiceKnownType(类型(列表))]
[ServiceKnownType(类型(列表))]
[ServiceKnownType(类型(列表))]
[ServiceKnownType(类型(列表))]
[ServiceKnownType(类型(列表))]
[ServiceKnownType(类型(列表))]
将消息加载到ResponseBase Messages集合时,会引发以下异常:

第1行位置906出错。元素 'http://schemas.datacontract.org/2004/07/CX.Framework.Common.BaseTypes:ResponseMessage' 包含映射到名称的类型中的数据 'http://schemas.datacontract.org/2004/07/CX.Framework.Common.BaseTypes:WarnMessage'. 反序列化程序不知道映射到此名称的任何类型。 考虑使用DATACONTractRelver或添加相应的类型 将“WarnMessage”添加到已知类型的列表中-例如,使用 KnownTypeAttribute属性,或将其添加到已知属性列表中 传递给DataContractSerializer的类型

我们已经在派生类型上完成了从ServiceKnownType到XMLInclude的所有工作。对于如何解决这个问题,我有点不知所措,希望任何人都能提供帮助。

以下几点:

1)
[xmlclude]
DataContractSerializer
没有影响,它仅由
XmlSerializer
使用

2) 正如评论员“flem”所建议的,我将直接在
响应消息上使用
[KnownType]
,而不是在服务上使用
[ServiceKnownType]


3) 我不记得
DataContractSerializer
是否在
[Serializable]
类型上查找
[KnownType]
。至少出于目前的测试目的,如果上面的#2没有帮助,请尝试使用类型
[DataContract]
(并使用
[DataMember]
属性数据成员)。

尝试将ResponseMessage的已知类型属性放在ResponseBase类定义上。我也这样做(使用
[DataContract]
[KnownType]
),它要求具有可变形类型成员的类用
[KnownType(typeof(DerivedTypeA))]
修饰。应该作为答案@flem发布!这是对问题的第一个回答,但谢谢你的回答。很高兴。。。这不仅仅是代表的问题!;)#2个有效,3个无效。由于我的编辑未被批准,我将把它放在这里,因为显然,无论是谁未批准它,都不希望它能够快速、轻松地为路人确定有效的解决方案。
[ServiceKnownType(typeof(ResponseBase))]
[ServiceKnownType(typeof(ResponseMessage))]
[ServiceKnownType(typeof(List<ResponseMessage>))]
[ServiceKnownType(typeof(DebugMessage))]
[ServiceKnownType(typeof(InfoMessage))]
[ServiceKnownType(typeof(ValidationMessage))]
[ServiceKnownType(typeof(WarnMessage))]
[ServiceKnownType(typeof(RecoverableFaultMessage))]
[ServiceKnownType(typeof(FatalFaultMessage))]
[ServiceKnownType(typeof(List<DebugMessage>))]
[ServiceKnownType(typeof(List<InfoMessage>))]
[ServiceKnownType(typeof(List<ValidationMessage>))]
[ServiceKnownType(typeof(List<WarnMessage>))]
[ServiceKnownType(typeof(List<RecoverableFaultMessage>))]
[ServiceKnownType(typeof(List<FatalFaultMessage>))]