2012-03-20 14 views
8

Sono sconcertato dal comportamento di DataContractSerializer. La nostra configurazione è basata su XML. XML viene utilizzato come origine per il metodo DataContractSerializer.ReadObject. Recentemente ho riscontrato un problema quando alcune proprietà dell'oggetto deserializzato non sono state impostate. Ho rintracciato le modifiche e scoperto che tali proprietà sono state aggiunte manualmente in XML. Che è OK secondo me. Apparentemente non era OK nel parere di DataContractSerializer perché sembra che si aspetti che i nodi XML siano ordinati alfabeticamente. Veramente?! La deserializzazione sembra una cosa molto semplice - leggi XML in sequenza, analizza il nome del nodo, imposta la proprietà corrispondente. Qual è lo scopo dell'ordine?La deserializzazione di DataContract non riesce a causa di un ordine errato dei nodi XML

C'è una soluzione? Forse una sorta di impostazioni per DataContractSerializer?

risposta

3

Ho riscontrato questo problema di recente. Per ovviare a ciò, ho usato il XmlSerializer e rimosso l'ordinamento esplicita dalle XmlElement attributi:

set proxy_tool="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SvcUtil.exe" /nologo /t:code /ser:XmlSerializer /UseSerializerForFaults 
set sed_tool="$(ProjectDir)sed.exe" -r -i "s/,?[[:space:]]*Order=[[:digit:]]+//" 

%proxy_tool% /o:"Proxy1.cs" /n:*,Namespaces.Name1 "Proxy1.wsdl" 
%sed_tool% "Proxy1.cs" 

%proxy_tool% /o:"Proxy2.cs" /n:*,Namespaces.Name2 "Proxy2.wsdl" 
%sed_tool% "Proxy2.cs" 

... 

C'è un po 'more information on my blog post.

Se si desidera sapere perché l'ordine è importante, è perché uno sequence in XSD ha un ordine definito e i contratti di servizio Web sono definiti con XSD.

Da the specification:

La conseguenza di questa definizione è che qualsiasi elemento che compare in un'istanza cui tipo è dichiarato USAddress (ad esempio ShipTo in po.xml) deve essere costituito cinque elementi ed un attributo. Questi elementi devono essere denominati nome, via, città, stato e zip come specificato dai valori degli attributi del nome delle dichiarazioni, e gli elementi devono apparire nella stessa sequenza (ordine) in cui sono dichiarati.

+0

Wow ... Sembra un po 'troppo complicato. Ma grazie per la risposta. Ho finito per provare DataContractSerializer e ha funzionato meglio per me. – Schultz9999

+0

Non esiste un modo per utilizzare la definizione "xs: all" in DataContract? Quindi l'ordine non ha importanza? – Nicholi

+0

@Nicholi Forse se hai il controllo sui WSDL –

3

È possibile utilizzare il membro Ordine di DataMemberAttribute per aiutare con questo, ma nella maggior parte dei casi: XML è specifico dell'ordine (per elementi, non attributi) - quindi non è specificamente sbagliato.

Detto questo: se si desidera un controllo preciso sulla serializzazione XML, DataContractSerializer è una scelta sbagliata XmlSerializer offre un maggiore controllo - ed è meno pignolo reir iirc.

+0

Vedo il vostro punto. Immagino di essere pigro in questo caso perché lo stesso oggetto è usato come parametro per il servizio basato su WCF quindi è abbastanza comodo non pensare a due modi di serializzazione. – Schultz9999

Problemi correlati