2012-02-10 27 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