具有复杂抽象类型集合的WCF抽象基类不包含在服务响应中用于反序列化



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

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

消息集合可以是以下任何类型:

[Serializable]
[XmlInclude(typeof(DebugMessage))]
[XmlInclude(typeof(InfoMessage))]
[XmlInclude(typeof(ValidationMessage))]
[XmlInclude(typeof(WarnMessage))]
[XmlInclude(typeof(RecoverableFaultMessage))]
[XmlInclude(typeof(FatalFaultMessage))]
public abstract class ResponseMessage
{
    //..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>))]

当我们将消息加载到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"。反序列化程序不知道映射到该名称的任何类型。考虑使用DataContractResolver或添加对应的类型将'WarnMessage'添加到已知类型列表中-例如,通过使用KnownTypeAttribute属性或将其添加到已知列表中传递给DataContractSerializer的类型

我们已经对派生类型做了从ServiceKnownType到XMLInclude的所有工作。对于如何解决这个问题,我有点不知所措,如果有人能提供帮助,我将不胜感激。

几点:

1) [XmlInclude]DataContractSerializer没有影响,它只被XmlSerializer使用。

2)正如评论者"flem"建议的那样,我将直接在ResponseMessage上使用[KnownType],而不是在服务上使用[ServiceKnownType]

3)我不记得DataContractSerializer是否甚至在[Serializable]类型上寻找[KnownType]。至少现在为了测试的目的,如果上面的#2没有帮助,请尝试将类型设置为[DataContract](并将数据成员属性设置为[DataMember])。

最新更新