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)

<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 的标头)

[{"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 回答
0

XML 序列化器只允许序列化带有“set”的属性。

于 2013-10-18T14:23:44.510 回答
0

你用什么来序列化它?如果您不需要属性,则可以使用此处提到的 DataContractSerializer 。默认情况下,没有设置的属性不会序列化,但是使用 DataContractSerializer 或实现 IXmlSerializable 应该可以为您解决问题。

using System;
using System.Runtime.Serialization;
using System.Xml;
[DataContract]
class MyObject {
    public MyObject(Guid id) { this.id = id; }
    [DataMember(Name="Id")]
    private Guid id;
    public Guid Id { get {return id;}}
}
static class Program {
    static void Main() {
        var ser = new DataContractSerializer(typeof(MyObject));
        var obj = new MyObject(Guid.NewGuid());
        using(XmlWriter xw = XmlWriter.Create(Console.Out)) {
            ser.WriteObject(xw, obj);
        }
    }
}
于 2013-10-18T14:30:29.537 回答