2012-02-10 11 views
5

Non sono sicuro che si tratti di un problema o meno.IEnumerable vs List nella classe Response, ServiceStack

Se uso List qui, funziona in entrambi i root/xml/metadati op = Concorsi e root/Concorsi

[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 Content lunghezza: lunghezza

<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> 

Ma se io uso "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; } 
} 

La collezione Concorsi scomparso dalla pagina di meta root/xml/metadati op = Concorsi

HTTP/1.1 200 OK 

Content-Type: application/xml Content-Length: lunghezza

<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> 

risposta

3

ServiceStack utilizza il. XML DataContractSerializer di NET è alla base della sua serializzazione XML, che è il comportamento che si vede. Funziona anche con POCO, ad esempio gli attributi [DataContract] e [DataMember] sono facoltativi.

Si sconsiglia inoltre l'uso di interfacce su DTO (IMO non c'è una buona ragione per) che dovrebbe essere digitato e come possibile auto-descrittivo. Molte serializzazioni non sapranno quale sia il tipo concreto di IEnumerable dovrebbe essere così deve fare alcuni hack come output metadata di tipo dynamic dynamic nel payload, o assumere un tipo di raccolta di default.

Nota: Se si desidera che l'XML sia più bella di quanto deve definire uno spazio dei nomi per i vostri DTOs - il modo migliore per farlo è definire un attributo Assembly nei tuoi AssemblyInfo.cs di file:

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

Mi rendo conto che è piuttosto vecchio, ma ancora. IEnumerable non sarebbe l'unica interfaccia che si desidera utilizzare durante la serializzazione? Permetterebbe di restituire la raccolta. Durante la lettura dal database e lo streaming verso la rete, questa potrebbe essere un'utile ottimizzazione. – AVee