如何在C#.NET Web API </arrayoftype> </types>中将类型“Type”的集合序列化为<types>而不是<arrayoftype>

时间:2013-10-09 06:37:22

标签: c# xml-serialization asp.net-web-api

我有一个.NET Web API项目,我有一个数据传输对象类,我想序列化为XML。

类(简化)基本上定义如下:

[XmlType("user")]
public class PublicVisibleUserDTO
{   
    public long id { get; set; }
    public string screenname { get; set; }
}

现在,当我调用一个只返回一个元素的函数时,我得到了正常的XML:

<user>
    <id>123</id>
    <screenname>john</screenname>
</user>

但是,当我有一个返回此数据传输对象集合的函数时,我得到:

<ArrayOfUser>
    <user>
        <id>123</id>
        <screenname>john</screenname>
    </user>
    <user>
        <id>124</id>
        <screenname>jane</screenname>
    </user>
</ArrayOfUser>

但我想要的是:

<users>
    <user>
        <id>123</id>
        <screenname>john</screenname>
    </user>
    <user>
        <id>124</id>
        <screenname>jane</screenname>
    </user>
</users>

所以基本上我希望将集合作为“types”(用户)而不是“ArrayOfType”(ArrayOfUser)返回。我该怎么做?

我尝试在类声明的顶部应用XmlArray / XmlArrayAttribute函数,但这不能应用于类定义。

1 个答案:

答案 0 :(得分:2)

我找到了一个基于jbl的link提供的解决方法。 (我称之为解决方法而不是解决方案,因为我无法相信没有更简单的方法来实现这一目标,但至少现在可以完成工作。)

我添加了一个额外的类,它继承自List,链接建议:

[XmlRoot("users")]
public class PublicVisibleUsersList : List<PublicVisibleUserDTO> { }

现在,默认情况下,当在一个返回多个元素的控制器动作中执行Linq查询时,我会得到某种IEnumberable。所以我现有的控制器动作看起来像是:

    // GET api/users
    public IEnumerable<PublicVisibleUserDTO> Getusers()
    {
        var results = dbContext.Users.Where...//Entity Framework Linq query to fill data from database
        return results;
    }

但我修改了它以返回新集合类型的值:

    // GET api/users
    public PublicVisibleUsersList Getusers()
    {
        PublicVisibleUsersList myList = new PublicVisibleUsersList();
        var results = dbContext.Users.Where...//Entity Framework Linq query to fill data from database
        myList.AddRange(results); //AddRange() accepts an IEnumerable<T>, so I'm able to "convert" my results from the linq query to my newly defined list type by adding the result values to myList           
        return myList;
    }