如何获得正确的命名空间输出

时间:2011-11-22 19:33:13

标签: c# xml wcf xml-serialization

我有一个实现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>

我做错了什么?这是配置问题吗?

2 个答案:

答案 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

看看这是否有帮助。