gpt4 book ai didi

c# - 具有复杂抽象类型集合的 WCF 抽象基类未包含在服务响应中进行反序列化

转载 作者:太空狗 更新时间:2023-10-29 20:28:02 24 4
gpt4 key购买 nike

我们正在为我们应用程序中的所有 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 Response 对象都继承自 ResponseBase,但即使在 WCF Contract 上具有以下 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 集合中时,会抛出以下异常:

Error in line 1 position 906. Element 'http://schemas.datacontract.org/2004/07/CX.Framework.Common.BaseTypes:ResponseMessage' contains data from a type that maps to the name 'http://schemas.datacontract.org/2004/07/CX.Framework.Common.BaseTypes:WarnMessage'. The deserializer has no knowledge of any type that maps to this name. Consider using a DataContractResolver or add the type corresponding to 'WarnMessage' to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding it to the list of known types passed to DataContractSerializer.

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

最佳答案

一些事情:

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

2) 正如评论者“flem”所建议的,我会直接在 ResponseMessage 上使用 [KnownType] 而不是在服务。

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

关于c# - 具有复杂抽象类型集合的 WCF 抽象基类未包含在服务响应中进行反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13976911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com