2012-02-10 16 views
5

Nie jestem pewien, czy to problem, czy nie.IEnumerable vs Lista w klasie odpowiedzi, ServiceStack

Jeśli użyję tu wymieniać, to działa zarówno w root/XML/metadanych OP = Konkursy i root/Konkursy

[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- długość: długość

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

Ale jeśli mogę użyć "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; } 
} 

Kolekcja Konkursy zniknął ze strony meta root/xml/metadata OP = Konkursy

HTTP/1.1 200 OK 

Content-Type:? Application/xml Content-Length: Długość

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

Odpowiedz

3

ServiceStack używa. NET DataContractSerializer NET pod maską dla jego Serializacji XML, która jest zachowaniem, które widzisz. Działa również z POCO, tzn. Atrybuty [DataContract] i [DataMember] są opcjonalne.

Nie zaleca się również używania interfejsów w DTO (IMO nie ma żadnego powodu), który powinien być tak napisany i jak samopisujący się, jak to możliwe. Wiele serialiów nie będzie wiedzieć, jaki powinien być konkretny typ IEnumerable, więc musi zrobić kilka hacków, takich jak wyjściowe metadane dynamicznego typeinfo w polu danych, lub założyć domyślny typ kolekcji.

Uwaga: Jeśli chcesz XML być ładniejsza niż należy zdefiniować przestrzeń nazw dla swoich DTOs - najlepszym sposobem na to jest zdefiniowanie atrybutu zamontowania w swoim AssemblyInfo.cs plik:

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

Rozumiem, że to dość stare, ale wciąż. Czy IEnumerable nie byłby jedynym interfejsem, którego chcesz użyć podczas serializacji? Pozwoliłoby to na zwrócenie kolekcji. Czytanie z bazy danych i przesyłanie strumieniowe do sieci może być przydatną optymalizacją. – AVee

Powiązane problemy