5

¿Es posible que DataContractSerializer deserialice incorrectamente un objeto si los campos no están en el orden "correcto" (lo que sea que eso signifique)?Serializar/deserializar objetos: ¿importa el orden de los campos?

Las clases que intento serializar/deserializar no tienen atributos de orden colocados en campos/propiedades. Sin embargo, uno de mis campos siempre se deserializa como null aunque tenga un valor no nulo (en realidad contiene una lista de cadenas).

Cuando moví dos elementos XML en un archivo serializado para hacer coincidir el orden en otro ejemplo XML (para el cual la deserialización funcionó sin problemas), todo comenzó a funcionar.

Esto no tiene sentido para mí, pero tal vez alguien lo sepa mejor. ;)

Respuesta

13

Para ser elegible para la serialización/serialización correcta por el DataContractSerializer, todo lo siguiente debe ser verdadero.

  1. La clase que debe ser serializado debe tener SerializableAttribute o DataContractAttribute conjunto;
  2. Las propiedades y los campos de la clase que se deben serializar requieren el conjunto DataMemberAttribute;
  3. El tipo de datos de la propiedad o campo serializable debe ser serializable (es decir, tener un ctor público y heredar ISerializable);
  4. La clase que se debe serializar debe implementar IExtensibleDataObject;
  5. Nota: los campos serializables pueden ser públicos o privados.
  6. Members must be in alphabetical order o debe utilizar el Order-property del DataMemberAttribute.

Por lo tanto, el orden de la declaración hace materia. Si los miembros no están en orden alfabético, se omiten. Consulte this answer at StackOverflow for an example, tal vez se aplique a su caso.

+0

A partir de .NET 3.5 SP1, la primera y la segunda reglas se pueden omitir. – JustAMartin

+0

@Martin: ¿seguro? Por ejemplo, para los servicios web, que requieren ser serializables, aún requieren 'DataMemberAttribute', incluso en .NET 4.0. ¿Tienes un enlace a una referencia? Me interesaría leer más sobre eso (y luego actualizar mi respuesta). – Abel

+0

El enlace en la regla 6 está muerto – bkribbs

Cuestiones relacionadas