0

私は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 シリアル化は、パブリック フィールドとプロパティのみをシリアル化します。

この場合、なぜドキュメントに反して動作するのですか?

4

2 に答える 2

5

Web API は、デフォルトで XmlSerializer の代わりに DataContractSerializer を使用します。これは、[Serializable]他のものを見る前にすべてのフィールドを調べてシリアル化します。

あなたの型は、XmlSerializer を使用してシリアル化されるように設計されているようです。次の行を追加することをお勧めします。

config.Formatters.XmlFormatter.UseXmlSerializer = true;

これにより、すべてのパブリック プロパティが確実にシリアル化され、すべての XML シリアル化属性[XmlAttribute]が尊重されます。

于 2013-05-20T14:29:00.343 に答える