私は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 シリアル化は、パブリック フィールドとプロパティのみをシリアル化します。
この場合、なぜドキュメントに反して動作するのですか?