Asp.net MVC4 Web API XML序列化忽略了公共属性

m03*_*eek 0 xml asp.net asp.net-mvc xml-serialization asp.net-web-api

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

我有这样的类的测试控制器:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

"[{"property1":1,"property2":2},{"property1":3,"property2":4}]"
Run Code Online (Sandbox Code Playgroud)

但是当我使用XML格式时,它序列化不是public(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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

问题是如何强制xml serializator序列化公共属性.隐藏(忽略)私有属性不是问题.我无法理解为什么它会完全序列化私有属性,我在msdn docs和其他地方读过:

XML序列化仅序列化公共字段和属性.

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

You*_*oui 5

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

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

config.Formatters.XmlFormatter.UseXmlSerializer = true;
Run Code Online (Sandbox Code Playgroud)

这将确保所有公共属性都被序列化,并确保所有XML序列化属性都[XmlAttribute]得到尊重.