如何序列化的类“类型”作为一个集合 而不是 在C#.NET的Web API(How to

2019-10-18 18:00发布

我在那里我有我想要序列化到XML的数据传输对象一类的.NET Web API项目。

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

[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>

所以基本上我想收集到的“类型”(用户),而不是“ArrayOfType”(ArrayOfUser)返回。 我该怎么做呢?

我曾尝试在类声明的顶部施加XmlArray / XmlArrayAttribute功能,但不能应用于类定义。

Answer 1:

我发现基于JBL的一个解决方法的链接提供。 (我把它叫做一个解决办法,而不是因为我不能相信,没有实现这个简单的方法解决,但至少这现在得到了完成工作)。

我补充说,从名单继承为纽带,暗示一个额外的类:

[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;
    }


文章来源: How to serialize a collection of class “Type” as rather than in C#.NET Web API