我有一个.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函数,但这不能应用于类定义。
答案 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;
}