1

.NET 3.5

所以我在一些挫折之后才来问这个。我遇到的主要问题是,正在序列化的类中的某些属性包括 XML 中的 xmlns 属性。

特定属性位于对象的基类或对象内部的对象上。我可以完全控制这些,并将 datacontract(NameSpace="") 属性添加到我的所有数据合同中。

我不担心顶级 xmlns 或 xmlns:i,而只担心类中较低级别的。

请参阅从 WCF 宁静响应中删除 xml 命名空间

[DataContract(Namespace = "")]
BaseClass
{
    [DataMember]
    public string Name{get;set;}
}

[DataContract(Namespace = "")]
OtherClass
{
    [DataMember]
    public decimal Income{get;set;}
}

[DataContract(Namespace = "")]
DerivedClass
{
    [DataMember]
    public int Age{get;set;}

    [DataMember]
    public OtherClass Foo{get;set;}
}

在 Derived 类的序列化中,这就是我在 XML 中得到的。

<DerivedClass
    xmlns="http://IDontCareAboutThisOne"
    xmlns:i="http://IDontCareAboutThisOneEither">
    <Name xmlns="">iMortalitySX</Name>
    <Age>30</Age>
    <Foo>
        <Income xmlns="">0.0</Income>
    </Foo>
</DerivedClass>

这当然只是一个例子。此外,如果您好奇,我已经通过 WCF 服务完成了这项工作,并直接使用 DataContractSerializer 获得了相同的结果(应该如此)。我需要这个,因为旧网络上返回的数据量很大。我刮胡子的每一点都会有很大的不同。

是的,我考虑过 JSON,但客户需求推动了 XML。还有其他我不同意的原因,但它需要在 XML 中。此外,仅供参考,第三方序列化程序不是这个选项。我被 MS 基础的东西困住了。我将其公开为带有 WebBehavior 的 WebHttpBinding,作为 REST 类型的服务。我没有使用 REST 入门工具包,也不会。

4

2 回答 2

2

尝试使用ContractNamespaceAttribute将所有合同成员移动到同一个 XML 命名空间。这将摆脱单个成员的 xmlns 属性。

于 2013-08-14T12:39:31.757 回答
1

请注意您是否使用 Fiddler 之类的工具来检查您的消息,因为它的 XML 视图将添加到命名空间中,以使您更轻松。但是,这些名称空间不一定存在于原始原始视图中。

我犯了一个错误,在我不需要的时候试图研究这个问题。

xml 视图

Fiddler 在 notes 下添加了命名空间。

在此处输入图像描述

原始视图

命名空间不存在的同一节点

在此处输入图像描述

现在,我并不是说原始消息中没有任何我不需要的命名空间——只是如果您使用 Fiddler 检查消息,情况可能不会像您担心的那么糟糕。

于 2014-11-15T20:45:52.537 回答