2012-03-20 15 views
8

Estoy desconcertado con el comportamiento del DataContractSerializer. Nuestra configuración está basada en XML. XML se utiliza como fuente para el método DataContractSerializer.ReadObject. Recientemente he encontrado un problema cuando algunas propiedades del objeto deserializado no se establecieron. Seguí los cambios y descubrí que esas propiedades se agregaron a XML manualmente. Lo cual está bien en mi opinión. Aparentemente, no estaba bien en la opinión de DataContractSerializer porque parece que espera que los nodos XML se ordenen alfabéticamente. ¡¿De Verdad?! La deserialización parece algo muy sencillo: leer XML secuencialmente, analizar el nombre del nodo, establecer la propiedad correspondiente. ¿Cuál es el propósito de ordenar?La deserialización de DataContract falla debido a un orden incorrecto de los nodos XML

¿Hay una solución? Tal vez algún tipo de configuración para DataContractSerializer?

Respuesta

3

Hace un tiempo encontré este problema. Para trabajar alrededor de ella, he utilizado la XmlSerializer y quité el orden expresa de las XmlElement atributos:

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" 

... 

Hay un poco de more information on my blog post.

Si desea saber por qué el pedido importa, es porque un sequence en XSD tiene un orden definido, y los contratos del servicio web se definen con XSD.

De the specification:

La consecuencia de esta definición es que cualquier elemento que aparece en una instancia cuyo tipo se declarado ser direccionEEUU (por ejemplo enviarA en po.xml) debe constar de cinco elementos y un atributo. Estos elementos se deben denominar nombre, calle, ciudad, estado y código postal tal como se especifica en los valores de los atributos de nombre de las declaraciones, y los elementos deben aparecer en la misma secuencia (orden) en que se declaran.

+0

Wow ... Eso parece un poco complicado. Pero gracias por la respuesta. Terminé probando DataContractSerializer y me funcionó mejor. – Schultz9999

+0

¿No hay forma de que uno pueda usar la definición "xs: all" en DataContract? ¿Entonces el orden no importa? – Nicholi

+0

@Nicholi Tal vez si tienes control sobre los WSDL –

3

Puede usar el miembro Order de DataMemberAttribute para ayudar con esto, pero en la mayoría de los casos: XML es específico del pedido (para elementos, no para atributos), por lo que no es específicamente incorrecto.

Dicho esto: si desea un control preciso sobre la serialización XML, DataContractSerializer es una mala elección XmlSerializer ofrece más control, y es menos exigente con la orden iirc.

+0

Veo tu punto. Supongo que soy flojo en este caso porque el mismo objeto se usa como parámetro para el servicio basado en WCF, por lo que es conveniente no pensar en dos formas de serialización. – Schultz9999

Cuestiones relacionadas