ASP.Net Web API Xml 序列化问题

Posted

技术标签:

【中文标题】ASP.Net Web API Xml 序列化问题【英文标题】:ASP.Net Web API Xml searlization issue 【发布时间】:2016-12-11 19:51:10 【问题描述】:

我们面临着 ASP.NET WebAPI 的 xml searilization 的多个问题。目前我们使用xmlserializer 而不是DataContractSearilizer(这是XML 序列化的默认序列化方法)有两个基本原因。

    DataContractSearlizer中,我们需要按升序传递对象的所有字段,否则在api结束时为空。

    我们还需要在 XML 标头中传递命名空间,以便将 XML 对象传递给 Web api。

出于这两个基本原因,我们决定使用xmlserializer 而不是DataContractSearlizer。但现在我们面临另一个默认DataContractSearilization 机制中不存在的问题。假设我们有一个这样的对象

[DataContract]
public class Car

    public int ID;

    [DataMember]
    public string CarName;

    [DataMember]
    public string CarType;


现在我们期望在客户端我们只会收到由 DataMember 属性包围的那些字段,但出乎意料的是,无论 DataMember 属性是否存在,我们都会收到所有字段。这在 json searlization 中运行良好,结果是我们最初所期望的。有人可以在这方面帮助我们吗?

【问题讨论】:

This 可能会帮助你 【参考方案1】:

您可能正在寻找IgnoreDataMember 属性:

当应用于某个类型的成员时,指定该成员不是 数据契约的一部分,并且没有被序列化。

[DataContract]
public class Car

    [IgnoreDataMember]
    public int ID;

    [DataMember]
    public string CarName;

    [DataMember]
    public string CarType;


【讨论】:

我想我已经尝试过了,但它也不起作用。让我再试一次。几分钟后回复您。 哦,等等 - 试试 [XmlIgnore],因为你没有使用 DataContractSerializer - 我要快速... 不客气。请考虑接受答案。 虽然我的问题现在已经解决了,但是您知道为什么在 DataContractSearilizer 中我们需要按升序传递所有字段,否则字段值会变为 null 吗? 抱歉,我最初不知道如何将答案标记为已接受。阅读您的参考链接后,我已将您的答案标记为已接受

以上是关于ASP.Net Web API Xml 序列化问题的主要内容,如果未能解决你的问题,请参考以下文章

从 ASP Net Web API POST 请求中删除空的 xml 标记

Asp.Net Web API 错误:“ObjectContent`1”类型无法序列化内容类型“application/xml”的响应正文;字符集=utf-8'

Asp.Net Web API错误:'ObjectContent`1'类型无法序列化内容类型'application / xml的响应主体;字符集= UTF-8'(代码

ASP.NET WEB API 中自定义对象的序列化 [重复]

ASP.NET Web API:JSON 序列化循环引用

ASP.NET Web API 不返回 XML