【问题标题】:How to serialize derived types with WCF如何使用 WCF 序列化派生类型
【发布时间】:2017-04-13 08:50:17
【问题描述】:

我正在开发一个 WebService 客户端,但在派生类型序列化方面遇到了一些问题。

请求类

[MessageContract(WrapperName = "Request", WrapperNamespace = "http://www.test.com", IsWrapped = true)]
public class ServiceRequest
{
    [MessageHeader(Namespace = "http://www.test.com")]
    public AuthHeader AuthHeader { get; set; }

    [MessageBodyMember(Name = "Data", Order = 0)]
    public ServiceObject Request { get; set; }

    public ServiceRequest() { }

    public ServiceRequest(AuthHeader authHeader, ServiceObject request)
    {
        AuthHeader = authHeader;        
        Request = request;
    }
}

ServiceObject 类和派生类型

[XmlRoot(Namespace = "http://www.test.com")]
[XmlInclude(typeof(TestRequest))]
public abstract class ServiceObject
{ }

[XmlRoot(ElementName = "Test", Namespace = "http://www.test.com")]
public class TestRequest
{ }

结果 XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:AuthHeader xmlns="http://www.test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:h="http://www.test.com">
      <Username>TEST</Username>
      <Password>test</Password>
    </h:AuthHeader>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Request xmlns="http://www.test.com">
      <Data xsi:type="TestRequest" />
    </Request>
  </s:Body>
</s:Envelope>

为了正确序列化派生类,我必须进行哪些更改?

<Request xmlns="http://www.test.com">
    <Data>
       <Test/>
    </Data>
</Request>

提前致谢。

【问题讨论】:

    标签: c# wcf serialization messagecontract


    【解决方案1】:

    它很简单:您应该像这样将KnownType 属性添加到您的基类中:

    [DataContract]
    [KnownType(typeof(TestRequest))]
    public abstract class ServiceObject
    { }
    

    【讨论】:

    • 失败了。异常迫使我使用XmlIncludeSoapInclude。使用 XmlInclude KnownType 会产生相同的 XML。
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 2017-06-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多