2012-03-13 9 views
7

Najprostszym sposobem deserializacji xml ServiceStack jest praca, gdy xml zawiera przestrzeń nazw. Jednak otrzymany xml nie zawiera przestrzeni nazw. Najprostszy działający przykład:Odwzorowywanie XML działa tylko z przestrzenią nazw w xml

[Serializable] 
public class test 
{ 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml="<test xmlns=\"http://schemas.datacontract.org/2004/07/\"></test>"; 
     var result = ServiceStack.Text.XmlSerializer.DeserializeFromString<test>(xml); 
    } 
} 

Jednak nie tego chcę. Chcę dodaje deserializacji, ponieważ jest to xml uzyskać z kilku usług:

string xml="<test></test>"; 

Ale to daje mi następujący błąd:

DeserializeDataContract: Error converting type: Error in line 1 position 7. 
Expecting element 'test' from namespace 
'http://schemas.datacontract.org/2004/07/'.. 
Encountered 'Element' with name 'test', namespace ''. 

ja próbowałem:

[Serializable] 
[XmlRoot("test", Namespace = "")] 
public class test 

Nie mogę utworzyć nowego Serializera, ponieważ ServiceStack.Text.XmlSerializer jest statyczny. Muszę wybrać dla Microsoft XmlSerializer OR ServiceStack (nie oba). Znaczenie: jeśli nie mogę uzyskać tego prostego przykładu do pracy, muszę pominąć bardzo użyteczną część pakietu ServiceStack. Ostatnią rzeczą, której chcę, jest wstrzyknięcie jakiejś obojętnej przestrzeni nazw w przychodzącym xml.

Odpowiedz

23

ServiceStack używa .NET za Xml DataContractSerializer do serializacji XML do usunięcia Przestrzenie nazw musisz albo ustawić przestrzeni nazw do pustego łańcucha z:

[DataContract(Namespace="")] 
public class test { ... } 

Ale wtedy będziesz musiał oznaczyć każdą nieruchomość chcesz odcinkach z Atrybuty [DataMember]. Lepszym rozwiązaniem jest określenie pustą przestrzeń nazw dla wszystkich typów pod nazw C# i dodając atrybut Assembly w Assembly.cs pliku, np:

[assembly: ContractNamespace("", ClrNamespace = "MyServiceModel.DtoTypes")] 

Uwaga: Można usunąć atrybut [Serializable] - nie jest używany przez żaden serializer ServiceStack. Również wszystkie atrybuty XmlSerializer, takie jak [XmlRoot], są bezużyteczne, ponieważ ServiceStack używa DataContractSerializer .NET, a nie wcześniejszego XmlSerializer Microsoftu.

+0

Dzięki! To było brakujące ogniwo, którego potrzebowałem! Jakoś nie mogę znaleźć odpowiedniej dokumentacji dla ServiceStack ... – user1154148

+0

Jakikolwiek powód, dla którego nie napisałeś własnego deserializera XML? Microsoft wydaje się potrzebować właśnie tego typu magicznej konfiguracji sosu, aby działał, w przeciwieństwie do serializatora/deserializera JSON, który po prostu działa. – JasonD

+0

@JasonD Tak, nie lubię NIH'ing bez dobrego powodu i wolę nie używać XML. MSS XML DCS jest również dość wydajny dla XML, nie ma wiele korzyści dla wysiłku, który by wymagał. – mythz