servicestack,C#,Xml,Serialization,servicestack" /> servicestack,C#,Xml,Serialization,servicestack" />

C# 不显示具有CollectionDataContract属性的名称

C# 不显示具有CollectionDataContract属性的名称,c#,xml,serialization,servicestack,C#,Xml,Serialization,servicestack,我目前正在使用ServiceStack实现一个API,我遇到了一个问题。我得到的API规范定义了将发送到API的XML数据包。本规范不可更改,也不受本人控制 问题在于,在根元素中,有一个如下项目列表: <data> <id>0</id> <locationID>10</locationID> <cust> <id>0</id> </cust>

我目前正在使用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>

0
10
0
0
0
0
我已经实现了这个规范,并且它几乎是正确的,但是我不知道如何在没有周围父节点的情况下让元素在XML中重复

由于这是使用ServiceStack,所以我使用数据协定,并尝试将元素设置为CollectionDataContract,但它将元素包装在父节点中

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


有什么想法吗?

这在ServiceStack中使用的.NET的DataContract Xml序列化程序中是不可能的。如果您发现一个XmlSerializer确实支持此功能,您可以注册以使用该功能:

appHost.ContentTypeFilters.Register(ContentType.Xml, SerializeToStream, DeserializeFromStream);
或注册自定义contentType,如中所示:

就我个人而言,在本例中,我只返回一个序列化的xml字符串。您可以执行以下操作之一:

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

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

  • 登记(或)

e、 g:

appHost.ResponseFilters.Add((请求、回复、dto)=>
{
if(req.ResponseContentType==ContentType.Xml)
{
var sb=新的StringBuilder();
DataDto DataDto=(DataDto)dto;
某人加上一行(“”);
sb.AppendFormat(“{0}”,dataDto.Id);
//…等等
res.ContentType=ContentType.Xml;
使用(var sw=新StreamWriter(res.OutputStream)){
sw.WriteLine(sb.ToString());
}
res.Close();
}
});

不幸的是,这似乎不可能。问题是ServiceStack使用的序列化程序利用了DataContract,我无法找到用另一个序列化程序替换它的方法,很可能是因为这样我们就不能使用多种格式。我以完全相同的方式结束这篇文章,因为其他问题也被问到了类似的问题。感谢的可能重复,我最终拒绝了编写规范的人(他们将使用web服务),并强迫他们将节点包装在父节点中。让事情变得容易多了。
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();
    }
});