【问题标题】:Asp.net MVC4 Web API XML serialization ignores public propertiesAsp.net MVC4 Web API XML 序列化忽略公共属性
【发布时间】:2013-05-15 00:14:03
【问题描述】:

我正在使用 asp.net mvc4 web api。我有一些由 Devart Entity Developer 生成的类,它们具有以下结构:

[Serializable]
[XmlRoot("Test")]
[JsonObject(MemberSerialization.OptIn)]
public class Test
{
    [XmlAttribute("property1")]
    [JsonProperty("property1")]
    public int Property1
    {
        get { return _Property1; }
        set
        {
            if (_Property1 != value)
            {
                _Property1 = value;
            }
        }
    }
    private int _Property1;

    [XmlAttribute("property2")]
    [JsonProperty("property2")]
    public int Property2
    {
        get { return _Property2; }
        set
        {
            if (_Property2 != value)
            {
                _Property2 = value;
            }
        }
    }
    private int _Property2;
}

我有此类的测试控制器:

public class TestController : ApiController
{
    private List<Test> _tests = new List<Test>() ;

    public TestController()
    {
        _tests.Add(new Test() { Property1 = 1, Property2 = 2 });
        _tests.Add(new Test() { Property1 = 3, Property2 = 4 });
    }

    public IEnumerable<Test> Get()
    {
        return _tests;
    }
}

当我尝试以 JSON 格式获取测试值时,它会返回正确的响应:

"[{"property1":1,"property2":2},{"property1":3,"property2":4}]"

但是当我使用 XML 格式时,它序列化的不是公共(Property1)而是私有属性(即_Property1)和响应看起来像:

<ArrayOfTest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TestProject.Models.Data">
  <Test>
     <_Property1>1</_Property1>
     <_Property2>2</_Property2>
   </Test>
   <Test>
     <_Property1>3</_Property1>
     <_Property2>4</_Property2>
   </Test>
</ArrayOfTest>

UPD:我尝试将 [NonSerialized] 和 [XmlIgnore] 添加到私有属性,但这样 xml 输出为空,只是:

<ArrayOfTest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/PeopleAirAPI.Models.Data">
  <Test/>
  <Test/>
</ArrayOfTest>

问题是如何强制 xml 序列化器序列化公共属性。隐藏(忽略)私有属性不是问题。我完全不明白为什么它会序列化私有属性,我在 msdn 文档和其他地方读过:

XML 序列化只序列化公共字段和属性。

为什么在这种情况下它的行为与文档相反?

【问题讨论】:

    标签: asp.net xml asp.net-mvc asp.net-web-api xml-serialization


    【解决方案1】:

    Web API 默认使用 DataContractSerializer 而不是 XmlSerializer,它会查看 [Serializable] 并在查看其他任何内容之前序列化所有字段。

    看起来您的类型被设计为使用 XmlSerializer 进行序列化。我建议添加以下行:

    config.Formatters.XmlFormatter.UseXmlSerializer = true;
    

    这将确保所有公共属性都得到序列化,并且所有 XML 序列化属性(如 [XmlAttribute])都得到尊重。

    【讨论】:

    • 我尝试添加类似 [DataMember(Name = "property1")] 的内容来向序列化程序显示这些属性应该被序列化,但它没有帮助。您使用config.Formatters 的解决方案有效。
    【解决方案2】:

    试图将[XmlIgnore] 放在private long _Id;

    【讨论】:

    • 这是我尝试的第一件事。这样xml输出为空:&lt;MyClass&gt;&lt;/MyClass&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多