1

新しい PoC のために、いくつかの偽のデータを含む Web API サービスが必要でした。このオブジェクトモデルは、class1 が class2 のネストされた配列を持つ 2 つのクラスという非常に単純なものです。そこで、いくつかのデータをハードコーディングした FakeDataService の構築を開始しました。このサンプルでは簡潔にするために、多くのプロパティを省略しているため、コードは問題の本質に焦点を当てています。

public class Class1
{
    public string Prop1 { get; set; }
    public IEnumerable<Class2> Prop2 { get; set; }
    public IEnumerable<string> Prop3 { get; set; }
}    

public class Class2
{
    public string Prop4 { get; set; }
}

public static class FakeDatabase
{
    public static Class1 c1instance1 = new Class1 { Prop1 = "value1", 
                          Prop2 = new Class2[] { c2instance1 }, 
                          Prop3 = new string[] { "value3" } };

    public static Class2 c2instance1 = new Class2 { Prop4 = "Value4" };

    public static Class1[] AllData = new Class1[] { c1instance1 };

}

したがって、偽のデータベースの「AllData」は Class1 オブジェクトの配列 (この例では 1 つのみの「配列」) であり、Class1 オブジェクトには文字列プロパティ (prop1)、Class2 オブジェクトの配列 (prop2)、および文字列プロパティの配列 (prop3) に対して、Class2 オブジェクトには 1 つの文字列プロパティ (prop4) しかありません。

WebAPI コントローラーは、次のように基本的なものです。

public class ValuesController : ApiController
{

    // GET api/values
    public IEnumerable<Class1> Get()
    {
        return FakeDatabase.AllData;                                                                                                                                                                                       
    }

しかし、Values コントローラーを呼び出すと、結果は次のようになります。

<ArrayOfClass1 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FakeDataService.Models">
<Class1>
<Prop1>value1</Prop1>
<Prop2>
<Class2 i:nil="true"/>
</Prop2>
<Prop3 xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d3p1:string>value3</d3p1:string>
</Prop3>
</Class1>
</ArrayOfClass1>

Class2 オブジェクトのシリアル化によって i:nil=true が生成されることに注意してください。

数時間の検索の後 (私のサンプル データは、この単純なサンプルよりもずっと大きいものでした)、ネストされたオブジェクトの配列が静的インスタンスとして定義されていることが問題の根本原因であることがわかりました。例えば。FakeDatabase の初期コードを次のように変更します。

public static class FakeDatabase
    {
        public static Class1 c1instance1 = new Class1 { Prop1 = "value1", 
                Prop2 = new Class2[] { new Class2 { Prop4 = "Value4" }},
                Prop3 = new string[] { "value3" } };


        public static Class1[] AllData = new Class1[] { c1instance1 };

}

WebAPIコントローラーを呼び出すと、(正しく)次のようになります。

<ArrayOfClass1 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FakeDataService.Models">
<Class1>
<Prop1>value1</Prop1>
<Prop2>
<Class2>
<Prop4>Value4</Prop4>
</Class2>
</Prop2>
<Prop3 xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d3p1:string>value3</d3p1:string>
</Prop3>
</Class1>
</ArrayOfClass1>

したがって、唯一の違いは Class2 オブジェクトの配列です。この動作の説明は何ですか?

4

1 に答える 1