我正在使用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 serializator序列化公共属性。隐藏(忽略)私有属性不是问题。我无法理解为什么它会完全序列化私有属性,我在msdn docs和其他地方读过:
XML序列化仅序列化公共字段和属性。
为什么在这种情况下它会与文档相反?
答案 0 :(得分:5)
默认情况下,Web API使用DataContractSerializer而不是XmlSerializer,它会查看[Serializable]
并在查看其他任何字段之前序列化所有字段。
看起来您的类型设计为使用XmlSerializer进行序列化。我建议添加以下行:
config.Formatters.XmlFormatter.UseXmlSerializer = true;
这将确保所有公共属性都被序列化,并且所有XML序列化属性(如[XmlAttribute]
)都得到尊重。
答案 1 :(得分:1)
尝试将[XmlIgnore]
放在private long _Id;