0

次のようなApiControllerでメソッドを作成しようとしました。

public DemoList<Demo> GetAll()
{
    var result = new DemoList<Demo>() { new Demo(){Y=2}, new Demo(), new Demo(){Y=1} };
    result.Name = "Test";
    return result;
}

Demo と DemoList は次のようになります。

public interface INamedEnumerable<out T> : IEnumerable<T>
{
    string Name { get; set; }
}

public class Demo
{
    public int X { get { return 3; } }
    public int Y { get; set; }
}

public class DemoList<T> : List<T>, INamedEnumerable<T>
{
    public DemoList()
    {
    }

    public string Name { get; set; } 
}

次に、フィドラーで出力をチェックしました

GET http://localhost:8086/api/Demo

そして以下を得ました:

XML (application/xml に設定された Accept ヘッダー)

<ArrayOfDemo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/XXX.WebAPI"><Demo><Y>2</Y></Demo><Demo><Y>0</Y></Demo><Demo><Y>1</Y></Demo></ArrayOfDemo>

JSON (application/json に設定された Accept ヘッダー)

[{"X":3,"Y":2},{"X":3,"Y":0},{"X":3,"Y":1}]

私の質問は非常に単純です: X 変数が XML バージョンでシリアル化されないのはなぜですか (読み取り専用プロパティがシリアル化されていると思いました) 、さらに重要なのは、両方の場合でNameプロパティ (書き込み可能) がシリアル化されないのはなぜですか?? 私が期待したようにこれを機能させるための代替手段は何ですか?

編集: 私は WebAPI コンテキストにいることに注意してください! デフォルトでは、XmlSerializer は自動的に XmlMediaTypeFormatter に設定され、JSONSerializer は JsonMediaTypeFormatter に設定されます。

4

3 に答える 3

1

これはバグのようです...次の回避策を使用してトリックを作成しました:

public class ListWrapper<T>
{
    public ListWrapper(INamedEnumerable<T> list)
    {
        List = new List<T>(list);
        Name = list.Name;
    }

    public List<T> List { get; set; }

    public string Name { get; set; }
}
于 2013-10-21T05:57:56.343 に答える