繁体   English   中英

WCF序列化使用类实现IXmlSerializable忽略XmlRoot名称

[英]WCF serialization ignores XmlRoot name with class implement IXmlSerializable

这是我的WCF服务类:

class MyService : IMyService
{
   public String GetService(MyRequest request){...}
}

这是请求类:

[XmlRoot("RequestClass")]
class MyRequest : IXmlSerializable
{
    public String Id {get;set;}
    public String ReqContent {get;set;}

    public void ReadXml(XmlReader reader)
    {
        using (XmlReader rr = reader.ReadSubtree())
        {
            Id = ...;
            ReqContent = ...;
        }
    }

    public void WriteXml(XmlWriter writer)
    {
       // write customize format content to the writer
    }
}

使用以下XmlSerializer实例测试了MyRequest类的序列化:

    StringBuilder xml = new StringBuilder();
    XmlSerializer ser = new XmlSerializer(typeof(MyRequest), "");
    using (XmlWriter writer = XmlWriter.Create(xml))
    {
        ser.Serialize(writer, req);
    }

并得到如下的xml:

<RequestClass>
   <Id>123</Id>
   <ReqContent>...</ReqContest>
</RequestClass>

这里一切都很好。 但是,在我应用WCF服务并将请求类传递给服务之后,ReadXml中的xml如下所示:

<request xmlns="http://tempuri.org/">
       <Id>123</Id>
       <ReqContent>...</ReqContest>
<request>

WCF序列化程序替换了类的根元素,如何解决此问题?

任何想法都值得欢迎和赞赏,我已经在这个问题上困扰了几天。

PS1:我已经阅读了这篇文章 ,并且不知道如何解决此问题。 PS2:我不确定这是否是由我在项目中使用的ClearUsernameBinding引起的。 如果是,如何在不更改绑定的情况下进行修复?

我认为一切都在PS1中提到的帖子中进行了描述。 您应该确定您的服务是否为SOAP服务。 如果是这样,您可以使用消息合同属性而不是datacontract(实际上不使用)来完全控制消息合同。 如果要进行XML序列化,则应将[XmlSerializerFormat]添加到服务合同中。 请参阅DataContract XML序列化和XML属性

对于自定义序列化,您还可以实现自己的序列化器,并使用行为将其注入WCF管道

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM