【问题标题】:Wrong user of inheritance at wcf servicewcf 服务中错误的继承用户
【发布时间】:2011-11-17 11:02:54
【问题描述】:

由于

,我得到一个错误
<ServiceKnownType(GetType(EmailMessageTemplate))> _
<ServiceKnownType(GetType(SmsMessageTemplate))> _
  <OperationContract()> <WebMethod()> _
    Public Function GetMessageTemplates(ByVal handlerId As Integer) As Collection(Of MessageTemplate)
        Dim result = New Collection(Of MessageTemplate)

        result = MessageDataAccess.GetMessageTemplates(handlerId)

        Return result
    End Function

我是wcf服务的网络方法(因为我使用:

<%@ServiceHost Language="VB" Service="MyAppITWS.Service1" %>

我将我的应用程序称为服务参考

结果是EmailMessageTemplatesSmsMessageTemplates 的集合。这是我的 dtacontracts:

[DataContract]
public class EmailMessageTemplate : MessageTemplate
{
        [DataMember]
        public string EmailSubject { get; set; }
        [DataMember]
        public EmailFormat EmailFormat { get; set; }
}

[DataContract]
public class EmailMessageTemplate : MessageTemplate
{
    [DataMember]
    public string EmailSubject { get; set; }
    [DataMember]
    public EmailFormat EmailFormat { get; set; }
}

[DataContract]
public class SmsMessageTemplate : MessageTemplate
{
}

我该如何解决?

这是一个非常错误的错误:

{System.Runtime.Serialization.SerializationException:第 1 行位置 1535 中的错误。元素 'http://schemas.datacontract.org/2004/07/MyAppUtils.DataModel.Messaging:MessageTemplate' 包含的数据 'http://schemas.datacontract.org/2004/07/MyAppUtils.DataModel.Messaging:EmailMessageTemplate' 数据合同。反序列化器不知道映射的任何类型 到这个合同。添加 'EmailMessageTemplate' 对应的类型 到已知类型的列表 - 例如,通过使用 KnownTypeAttribute 属性或通过将其添加到已知列表中 传递给 DataContractSerializer 的类型。 w System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator 阅读器、字符串名称、字符串 ns、DataContract 和 dataContract) w System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle 声明TypeHandle, String 名称,字符串 ns) w ReadArrayOfMessageTemplateFromXml(XmlReaderDelegator,XmlObjectSerializerReadContext,XmlDictionaryString, XmlDictionaryString , CollectionDataContract ) w System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader、XmlObjectSerializerReadContext 上下文) w System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract,XmlReaderDelegator 阅读器) w System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator 阅读器、字符串名称、字符串 ns、DataContract 和 dataContract) w System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader,类型声明类型,DataContract dataContract,字符串名称, 字符串 ns) w System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader,布尔验证对象名称) w System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator 读者,布尔验证对象名称) w System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader 读者,布尔验证对象名称) w System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader 阅读器,PartInfo 部分,布尔 isRequest)}

【问题讨论】:

    标签: .net wcf serialization


    【解决方案1】:

    您是否阅读了错误消息的第一行?

    反序列化器不知道任何映射到该合约的类型。将与“EmailMessageTemplate”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。

    也就是说,将以下属性添加到您的MessageTemplate 类中

    [DataContract]
    [KnownType(typeof(EmailMessageTemplate)]
    public class MessageTemplate 
    {
    
    }
    

    请参阅this link 了解工作示例

    【讨论】:

      【解决方案2】:

      KnownType 通常应用于基本类型 - 即

      [DataContract, KnownType(typeof(MessageTemplate)), ...] 
      

      (也可以在DataContractSerializer构造函数中指定已知类型,不需要属性)

      如果框架类不知道所有派生类型,那么你需要在创建序列化器时指定已知类型:

      语法是

      [KnownType(typeof(SubClass))] 
      public class BaseClass 
      

      【讨论】:

      • 点击编辑时间,例如“33 分钟前”,显示编辑历史。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多