首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF服务中自定义类型的XmlSerialization

WCF服务中自定义类型的XmlSerialization
EN

Stack Overflow用户
提问于 2012-05-15 18:22:34
回答 1查看 1K关注 0票数 0

我是WCF的新手。我为它开发了一个WCF服务和客户端。服务方法将检索使用自定义XML序列化程序的自定义数据。我读到过,在这种情况下,契约方法应该标记为[XmlSerializerFormat]

代码语言:javascript
复制
[ServiceContract]
[XmlSerializerFormat]
public interface ITSService
{
    [OperationContract]
    [XmlSerializerFormat]
    ProtocolDocument GetReferenceData(string referenceType, SerializableDictionary<string, string> args);

ProtocolDocument实现了IXmlSerializable

代码语言:javascript
复制
[XmlRoot("protocol", Namespace = Protocol30Namespace)]
[Type(Name = "protocol", Namespace = Protocol30Namespace)]
public class ProtocolDocument : ProtocolElement, ICloneable, IXmlSerializable

VS 2010默认选择wsHttpBinding。我不需要安全系统,所以我把它关掉了。

以下是服务配置:

代码语言:javascript
复制
<services>
   <service name="MyNamespace.TSService" 
            behaviorConfiguration="MyNamespace.TSServiceBehavior">
      <host>
         <baseAddresses>
            <add baseAddress = "http://localhost:51944/TSService.svc" />
         </baseAddresses>
      </host>
      <endpoint 
          address="" 
          binding="wsHttpBinding" 
          bindingConfiguration="nonSecurityWSHttpBinding"
          contract="MyNamespace.ITSService">
         <identity>
            <dns value="localhost"/>
         </identity>
      </endpoint>
      <endpoint 
          address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>
   </service>
</services>
<behaviors>
   <serviceBehaviors>
      <behavior name="MyNamespace.TSServiceBehavior">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
   </serviceBehaviors>
</behaviors>
<bindings>
   <wsHttpBinding>
      <binding name="nonSecurityWSHttpBinding">
         <security mode="None">
            <transport clientCredentialType="None"/>
         </security>
      </binding>
   </wsHttpBinding>
</bindings>

然后,我为该服务生成了客户端,但结果无法反序列化。Fiddler说SOAP将序列化数据封装到GetReferenceDataResultGetReferenceDataResponse

代码语言:javascript
复制
 <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://tempuri.org/ITourSystemService/GetReferenceDataResponse</a:Action>
    <a:RelatesTo>urn:uuid:3d7f6dc0-4961-4bc5-b1fc-c9997af9fbd4</a:RelatesTo>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <GetReferenceDataResponse xmlns="http://tempuri.org/">
      <GetReferenceDataResult>
          <header version="3.0" language="Russian"/>
          <references/>
      </GetReferenceDataResult>
    </GetReferenceDataResponse>
  </s:Body>
</s:Envelope>

但是缺少根元素!我该怎么办?

PS序列化实施:

代码语言:javascript
复制
 void IXmlSerializable.ReadXml(XmlReader reader)
{
    var serializer = new ProtocolDocumentXmlSerializer();
    serializer.Deserialize(this, reader);
}

void IXmlSerializable.WriteXml(XmlWriter writer)
{
    //
    // Serialize everything except the root element, because it was already written by .NET XML-serialization mechanism
    var xmlSerializationFlags = XmlSerializationFlags.All & ~XmlSerializationFlags.IncludeRootElement;

    var serializer = new ProtocolDocumentXmlSerializer();
    serializer.Serialize(this, writer, xmlSerializationFlags);
}

Xml序列化工作得很好。它已经在使用中了。我想我的WCF配置是错的。

EN

回答 1

Stack Overflow用户

发布于 2012-05-15 19:38:12

您似乎已经显式地告诉它忽略WriteXml方法中的根元素--这就是没有根元素的原因

代码语言:javascript
复制
var xmlSerializationFlags = XmlSerializationFlags.All & ~XmlSerializationFlags.IncludeRootElement;

如果无法使反序列化起作用,您可以始终在XML级工作,方法是将message用作客户端契约中的返回类型,然后在消息上调用GetReaderAtBody,将数据加载到XElement中,并使用LINQ to XML将XML转换为在客户端使用的对象

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10598689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档