我们在应用程序中为所有Response DTO使用基类。该课程有以下签名:
[Serializable]
public abstract class ResponseBase
{
public bool Successful { get; set; }
public List<ResponseMessage> Messages { get; set; }
//...Other code...
}
Messages集合可以是以下任何类型:
[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>))]
当我们将Message加载到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的所有操作。我对如何解决这个问题感到有点失落,并感谢任何人都可以提供的帮助。
答案 0 :(得分:5)
一些事情:
1)[XmlInclude]
对DataContractSerializer
无效,仅由XmlSerializer
使用。
2)正如评论者“flem”建议的那样,我会在[KnownType]
上直接使用ResponseMessage
而不是[ServiceKnownType]
。
3)我不记得DataContractSerializer
是否在[KnownType]
类型上查找[Serializable]
。至少目前为了测试目的,如果上面的#2无效,请尝试改为使用[DataContract]
类型(并使用[DataMember]
对数据成员进行属性化)。