2011-06-17 13 views
5

Digamos que tengo una claseserialización valora no nula

[Serializable()] 
public class Car 
{ 
    public string model; 
    public int year; 
} 

me serializar que en el disco llamado "car.xx". Luego añadir una propiedad a mi clase de coche por lo que será la siguiente:

[Serializable()] 
public class Car 
{ 
    public string model; 
    public int year; 
    public string colour; 
} 

entonces yo Deserialize "car.xx" (que contiene 2 campos) a mi clase de coche actual que contiene 3 campos, lo que hará la propiedad "color" de nuestra clase de auto nulo.

¿Cómo puedo configurar que "nuevas propiedades" no obtengan valores nulos? Establecerlos en el constructor no ayudará.

estoy usando BinaryFormatter serializador

Quiero valores de cadena que son nulas para ser sustituido por ""

+0

has necesitado sólo la creación como este 'cadena pública de color = "red";'? –

+0

¿qué quieres que sea? si there * is * no hay color en los datos? –

+0

Quiero que sea "" en lugar de nulo – syncis

Respuesta

4

si no está utilizando XmlSerializer continuación, considere el uso de OnDeserializedAttribute, OnSerializingAttribute, OnSerializedAttribute, y atributos OnDeserializingAttribute

ver this.

como:

[Serializable()] 
public class Car 
{ 
    public string colour; 
    public string model; 
    public int year; 

    [OnDeserialized()] 
    internal void OnDeserializedMethod(StreamingContext context) 
    { 
     if (colour == null) 
     { 
      colour = string.Empty; 
     } 
    } 
} 
1

Todo depende de la serializador.

Algunos constructores de salto serializador; algunos serializadores ejecutan el constructor predeterminado. Algunos te dejan elegir. Algunos ofrecen devoluciones de llamadas de serialización.

Así que dependiendo de la serializador:

  • escribir un constructor sin parámetros pública para establecer un valor por defecto (o utilizar un campo de inicialización, que es en última instancia similar)
  • escribir un "en deserializar" devolución de llamada serialización para establecer un valor predeterminado antes de deserialización

o en el peor de los casos, la aplicación de serialización personalizado (ISerializable/IXmlSerializable/etc, dependiendo del serializador)

Por ejemplo, con BinaryFormatter:

[Serializable] 
public class Car : IDeserializationCallback 
{ 
    public string model; 
    public int year; 
    public string colour; 
    void IDeserializationCallback.OnDeserialization(object sender) 
    { 
     if (colour == null) colour = ""; 
    } 
} 

Con otros serializadores, podría utilizar [OnDeserialized] lugar. Nota; personalmente no estaría exponiendo campos públicos, incluso en un DTO. Pero if está usando BinaryFormatter, cambiando esto ahora es un cambio de última hora. Para compleción, tampoco estaría usando BinaryFormatter - es no muy amigable para esto. Hay otros serializadores disponibles que le harán menos daño.