2012-03-26 12 views
7

Tengo una base de código existente que persiste en un par de clases simples en el disco a través de NetDataContractSerializer, pero desafortunadamente las clases no están adornadas con [DataContract], sino con [Serializable]. Esto funciona bien, pero ahora quiero agregar algunas nuevas propiedades a las clases persistentes, y aún así poder leer los archivos generados por la versión anterior.Propiedades opcionales al deserializar un Mish-mash DataContract/Serializable

Digamos que esta es la clase:

[Serializable] 
public class Persisted 
{ 
    public int OldProperty {get;set;} 
    public int NewProperty {get;set;} 
} 

Ahora, cuando deserializar los archivos viejos, me sale una excepción, ya que no contienen NewProperty. Esto tiene sentido. Así que quería que se ignorara NewProperty, pero aunque hay un atributo [OptionalField] para que el serializador ignore el campo faltante, no se puede aplicar a las propiedades, solo a los campos.

por lo que pensé voy a utilizar [DataContract] y [DataMember], que también tiene una propiedad IsRequired, pero esto cambia la disposición del archivo serializado, y no puede leer los archivos de datos antiguos. Además, no puede mezclar [Serializable] y [DataMember] - si el serializador ve el atributo [Serializable], ignora las directivas [DataMember].

Entonces, salvo la opción de hacer una conversión única de los archivos antiguos (posible, pero no mi primera opción), ¿hay alguna manera de hacer que NetDataContractSerializer ignore un campo en un objeto XML serializado existente?

Respuesta

4

El problema es que cuando se utiliza el atributo Serializable, lo que se serializa son campos, no propiedades. Como está utilizando propiedades automáticas, los campos están ocultos y no puede agregarles atributos.

La solución es simple: no use propiedades automáticas.

Cuestiones relacionadas