序列化没有根标记的集合

时间:2014-08-12 20:12:07

标签: asp.net-web-api xml-serialization asp.net-web-api2

我尝试设置一个Web API端点,该端点具有XML格式与此类似的特定要求:

<broadcast>
    <name></name>
    <description></description>
    <episode>
        <title></title>
    </episode>
    <episode>
        <title></title>
    </episode>
    ...
</broadcast>

我的模特看起来像这样:

[DataContract]
public class broadcast
{
    [DataMember]
    public string name { get; set; }
    [DataMember]
    public string description { get; set; }
    [DataMember]
    public List<episode> episodes { get; set; }
}
[DataContract]
public class episode
{
    [DataMember]
    public string title { get; set; }
}

我遇到的问题是episode项目被放入容器标记&lt; episodes&gt;。有没有办法序列化episodes列表,以便容器标签不会出现?

4 个答案:

答案 0 :(得分:1)

事实证明有一种方法可以做到这一点,但你必须使用XmlSerializer。为此,请将以下行添加到WebApiConfig.cs

config.Formatters.XmlFormatter.UseXmlSerializer = true;

然后将[XmlElement]属性添加到您没有根标记的任何集合中。如果要使用根标记,请使用[XmlArray]。所以在我上面的例子中:

[XmlType]
public class broadcast
{
    [XmlElement]
    public string name { get; set; }
    [XmlElement]
    public string description { get; set; }
    [XmlElement] // could use [XmlArray] if I want a root tag
    public List episodes { get; set; }
}
[XmlType]
public class episode
{
    [XmlElement]
    public string title { get; set; }
}

答案 1 :(得分:1)

凯尔的答案几乎是正确的。您需要[XmlElement("episode")]才能实现此目的。

答案 2 :(得分:0)

据我所知,删除集合类型中的根元素是不可能的。这是Collection Type Serialization的主题,即使有多个选项可以使用CollectionDataContractAttribute之类的属性来更改集合的序列化,但是没有选项可以删除Serialized集合元素的根。

答案 3 :(得分:0)

您可以使用MessageContract代替DataContract。消息协定描述了与服务之间收发的SOAP消息的结构,使您可以检查和控制SOAP标头和正文中的大多数细节:


  [MessageContract]
  public class broadcast
  {
      [MessageBodyMember]
      public string name { get; set; }
      [MessageBodyMember]
      public string description { get; set; }
      [MessageBodyMember]
      public List<episode> episodes { get; set; }
    }

在这里您可以找到更多的信息和详细信息-> https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-message-contracts