序列化没有根标记的集合

问题描述 投票:1回答:4

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

<broadcast>
    <name></name>
    <description></description>
    <episode>
        <title>&lt/title>
    </episode>
    <episode>
        <title>&lt/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项目被放入容器标签 。有没有办法序列化 episodes列表,以便容器标签不出现?

asp.net-web-api xml-serialization asp.net-web-api2
4个回答
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
投票

凯尔的答案几乎是正确的。你需要[XmlElement("episode")]才能工作。


0
投票

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


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


© www.soinside.com 2019 - 2024. All rights reserved.