2012-03-13 12 views
7

Il modo più semplice per far funzionare la deserializzazione xml di ServiceStack è quando il xml contiene uno spazio dei nomi. Tuttavia, l'xml che ricevo non contiene spazi dei nomi. L'esempio più semplice:La deserializzazione XML funziona solo con lo spazio dei nomi in 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); 
    } 
} 

Tuttavia, questo non è quello che voglio. Voglio che la segue per deserializzare, dato che questo è il codice XML che ricevo da diversi servizi:

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

Ma che mi dà il seguente errore:

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

ho provato:

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

Non riesco a creare un nuovo serializzatore, perché ServiceStack.Text.XmlSerializer è statico. Devo scegliere tra Microsoft XmlSerializer O ServiceStack (non entrambi). Significato: se non riesco a far funzionare questo semplice esempio, ho bisogno di saltare una parte altrimenti molto utile del pacchetto ServiceStack. L'ultima cosa che voglio è iniettare qualche spazio dei nomi fittizio nell'xml in arrivo.

risposta

23

ServiceStack usa di .NET Xml DataContractSerializer per serializzare XML per rimuovere spazi dei nomi è necessario o impostare lo spazio dei nomi su una stringa vuota con:

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

Ma poi si dovrà contrassegnare ogni proprietà che si desidera serializzato con [DataMember] attributi. Una soluzione migliore è quella di specificare uno spazio dei nomi vuoto per tutti i tipi di sotto di un C# spazio dei nomi con l'aggiunta e l'attributo Assembly nel file Assembly.cs, ad esempio:

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

Nota: è possibile rimuovere l'attributo [Serializable] - non è usato da nessuno dei serializzatori di ServiceStack. Inoltre, tutti gli attributi di XmlSerializer come [XmlRoot] sono inutili poiché ServiceStack utilizza DataContractSerializer di .NET non XmlSerializer precedente di Microsoft.

+0

Grazie! Quello era l'anello mancante di cui avevo bisogno! In qualche modo non riesco a trovare la documentazione giusta come questa per ServiceStack ... – user1154148

+0

Qualche ragione per cui non hai scritto il tuo deserializzatore XML? Quello di Microsoft sembra aver bisogno solo di questo tipo di configurazione di salsa magica per farlo funzionare, a differenza del serializzatore/deserializzatore JSON, che funziona. – JasonD

+0

@JasonD Sì, non mi piace NIH'ing senza una buona ragione e preferisco non usare XML. XML DCS di MS è anche abbastanza performante per XML, c'è poco beneficio per la quantità di sforzo che avrebbe richiesto. – mythz

Problemi correlati