2009-08-26 15 views
9

Dada una clase como ésta:prueba para campo opcional al utilizar .NET personalizado serialización

[Serializable] 
public class MyClass { 
    string name; 
    string address; 

    public MyClass(SerializationInfo info, StreamingContext context){ 
     name = info.GetString("name"); 
     if(/* todo: check if a value for address exists */) 
      address = info.GetString("address"); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context){ 
     info.AddValue(name); 
     if(address != null) 
      info.AddValue(address); 
    } 
} 

¿Cómo puedo comprobar si existe un valor para el campo antes de llamar addressinfo.GetString(address)?

Sí, entiendo que simplemente podría escribir un campo address nulo, pero mi problema real es que las versiones anteriores de MyClass, no tenían un campo de dirección.

Nota: Tengo buenas razones para usar la serialización personalizada. Hay algunos campos estáticos que se utilizan como singleton y la deserialización predeterminada no respetará eso.

Respuesta

13

Bueno, un enfoque interesante es que se puede utilizar GetEnumerator (foreach) para iterar sobre los pares de nombre/valor, utilizando un switch en el nombre para manejar cada uno de ellos?

La implementación parece un poco no estándar, sin embargo; Del ejemplo here:

SerializationInfoEnumerator e = info.GetEnumerator(); 
    Console.WriteLine("Values in the SerializationInfo:"); 
    while (e.MoveNext()) 
    { 
     Console.WriteLine("Name={0}, ObjectType={1}, Value={2}", 
      e.Name, e.ObjectType, e.Value); 
    } 

Pero parece que también puede utilizar SerializationEntry:

[Serializable] 
class MyData : ISerializable 
{ 
    public string Name { get; set; } 
    public int Value { get; set; } 

    public MyData() { } 
    public MyData(SerializationInfo info, StreamingContext context) 
    { 
     foreach (SerializationEntry entry in info) 
     { 
      switch (entry.Name) 
      { 
       case "Name": 
        Name = (string)entry.Value; break; 
       case "Value": 
        Value = (int)entry.Value; break; 
      } 
     } 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("Name", Name); 
     info.AddValue("Value", Value); 
    } 
} 
Cuestiones relacionadas