我有一个实现IXmlSerializable的类。当我使用自定义XmlWriter / XmlReader时,它只是工作正常并输出正确的输出。但是,当我在WCF中使用它时,我得到一个非常干净的输出,它有点太干净,因为它不包含任何类型信息:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetModelCResponse xmlns="http://tempuri.org/">
<GetModelCResult>
<D xmlns="">D</D>
<E xmlns="">
<B>B</B>
<A>A</A>
</E>
</GetModelCResult>
</GetModelCResponse>
</s:Body>
</s:Envelope>
但是,我会期待这样的事情(使用XmlWriter时它 写):
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetModelCResponse xmlns="http://tempuri.org/">
<GetModelCResult xmlns:a="http://schemas.datacontract.org/2004/07/Model" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:D>D</a:D>
<a:E i:type="a:ModelA">
<a:A>A</a:A>
<a:B>B</a:B>
</a:E>
</GetModelCResult>
</GetModelCResponse>
</s:Body>
</s:Envelope>
我做错了什么?这是配置问题吗?
答案 0 :(得分:1)
您可以更改wcf使用的序列化程序。
您可能实现此目的的一种方法是使用
进行装饰[XmlSerializerFormat]
属性位于服务实现的顶部。
如果你需要更多的花里胡哨,你可以考虑使用自定义序列化器。
Dan Rigsby在his blog写了一篇与此主题相关的文章。在文章的最后,他讨论了如何创建IOperationBehavior的实现
这个想法很简单,创建一个操作行为,用普通的序列化程序替换普通的序列化程序。只要该类继承自Attribute,您就可以使用它来装饰实现。
答案 1 :(得分:0)
我们之前有过类似的东西,我在过去的笔记中注意到了这一点: http://www.pluralsight-training.net/community/blogs/kirillg/archive/2006/06/18/28380.aspx
看看这是否有帮助。