2012-02-10 43 views
5

我不知道这是否是一个问题。IEnumerable与列表中的响应类,ServiceStack

如果我在这里使用列表,它工作在两个根/ XML /元OP =比赛和根/比赛

[DataContract] 
public class CompetitionsResponse : IHasResponseStatus 
{ 
    [DataMember] 

    public List<Competitions> Competitions { get; set; } 

    //Auto inject and serialize web service exceptions 
    [DataMember] 
    public ResponseStatus ResponseStatus { get; set; } 
} 

HTTP/1.1 200 OK 的Content-Type:application/xml进行 内容 - 长度:长度

<CompetitionsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FSI.API.ServiceModel"> 
    <Competitions> 
    <Competitions> 
     <CompName>String</CompName> 
     <CompType>String</CompType> 
     <CompetitionID>0</CompetitionID> 
    </Competitions> 
    </Competitions> 
    <ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types"> 
    <d2p1:ErrorCode>String</d2p1:ErrorCode> 
    <d2p1:Errors> 
     <d2p1:ResponseError> 
     <d2p1:ErrorCode>String</d2p1:ErrorCode> 
     <d2p1:FieldName>String</d2p1:FieldName> 
     <d2p1:Message>String</d2p1:Message> 
     </d2p1:ResponseError> 
    </d2p1:Errors> 
    <d2p1:Message>String</d2p1:Message> 
    <d2p1:StackTrace>String</d2p1:StackTrace> 
    </ResponseStatus> 
</CompetitionsResponse> 

但是,如果使用 “IEnumerable的”

[DataContract] 
public class CompetitionsResponse : IHasResponseStatus 
{ 
    [DataMember] 
    public IEnumerable<Competitions> Competitions { get; set; } 

    //Auto inject and serialize web service exceptions 
    [DataMember] 
    public ResponseStatus ResponseStatus { get; set; } 
} 

比赛收集从元页消失 根/ XML /元数据OP =竞赛

HTTP/1.1 200 OK 

的Content-Type:application/xml进行 的Content-Length:长度

<CompetitionsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FSI.API.ServiceModel"> 
    <Competitions i:nil="true" /> 
    <ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types"> 
    <d2p1:ErrorCode>String</d2p1:ErrorCode> 
    <d2p1:Errors> 
     <d2p1:ResponseError> 
     <d2p1:ErrorCode>String</d2p1:ErrorCode> 
     <d2p1:FieldName>String</d2p1:FieldName> 
     <d2p1:Message>String</d2p1:Message> 
     </d2p1:ResponseError> 
    </d2p1:Errors> 
    <d2p1:Message>String</d2p1:Message> 
    <d2p1:StackTrace>String</d2p1:StackTrace> 
    </ResponseStatus> 
</CompetitionsResponse> 

回答

3

ServiceStack使用。 NET的XML DataContractSerializer的XML序列化,这是你看到的行为。它也适用于POCO,即[DataContract]和[DataMember]属性是可选的。

也不建议使用DTO的接口(IMO没有很好的理由),它应该尽可能地键入和自描述。许多序列化不会知道IEnumerable的具体类型应该是什么,因此必须执行一些hack操作,例如在有效内容中输出动态typeinfo元数据,或者采用默认的集合类型。

注意:如果你想在XML是漂亮比你应该定义你的DTO的命名空间 - 做最好的方式,是在你的的AssemblyInfo.cs定义大会属性文件:

[assembly: ContractNamespace("http://schemas.servicestack.net/types", 
    ClrNamespace = "FSI.API.ServiceModel")] 
+0

我意识到这是相当古老的,但仍然。 IEnumerable是不是你想在序列化时使用的一个接口?这将允许收益回报。从数据库读取数据并将数据流传输到网络时,这可能是一种有用的优化。 – AVee 2015-06-17 08:55:35