不显示具有CollectionDataContract属性的名称

时间:2012-06-15 04:11:32

标签: c# xml serialization servicestack

我目前正在使用ServiceStack实现API,我遇到了一个问题。我给出的API规范定义了将发送到API的XML数据包。此规范无法更改,也不受我自己控制。

问题在于,在根元素中,有一个列表如下:

<data>
    <id>0</id>
    <locationID>10</locationID>
    <cust>
       <id>0</id>
    </cust>
    <cust>
       <id>0</id>
    </cust>
    <cust>
       <id>0</id>
    </cust>
    <cust>
       <id>0</id>
    </cust>
</data>

我已经实现了规范并使其几乎正确,但我无法弄清楚如何在没有周围父节点的情况下在XML中重复这些元素。

由于这是使用ServiceStack,我使用的是Data Contracts,并尝试将该元素设置为CollectionDataContract,但是它将元素包装在父节点中。

我想知道是否可以指定不使用父元素,或者是否可以在包含没有父节点的节点的节点中实现普通List。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用ServiceStack中使用的.NET的DataContract Xml Serializer无法做到这一点。如果您找到支持此功能的XmlSerializer,您可以注册使用它而不是:

appHost.ContentTypeFilters.Register(ContentType.Xml, SerializeToStream, DeserializeFromStream);

或者注册自定义contentType,如下所示: http://www.servicestack.net/ServiceStack.Northwind/vcard-format.htm

在这种情况下,我个人会返回一个序列化的xml字符串。您可以这样做:

  • 在Service体中只返回一个字符串(您可以将其包装在HttpResult中以强制使用特定的ContentType)。返回服务中的XML字符串将始终为所有端点返回XML。

  • 通过覆盖ServiceBase中的OnAfterExecute并将强类型响应DTO转换为XML ContentType请求的XML字符串。

  • 注册custom response filter(或Filter Attribute

e.g:

appHost.ResponseFilters.Add((req, res, dto) =>
{
    if (req.ResponseContentType == ContentType.Xml)
    {
        var sb = new StringBuilder();
        DataDto dataDto = (DataDto)dto;
        sb.AppendLine("<data>");
        sb.AppendFormat("<id>{0}</id>",dataDto.Id);
        //... etc
        res.ContentType = ContentType.Xml;
        using (var sw = new StreamWriter(res.OutputStream)) {
          sw.WriteLine(sb.ToString());
        }
        res.Close();
    }
});