Pregunta

Dada una clase como ésta:

[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 probar si existe un valor para el campo address antes de llamar info.GetString(address)?

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

Nota: Tengo buenas razones para el uso de serialización personalizado. Hay algunos campos estáticos que están siendo utilizados como simple y la deserialización por defecto no va a respetar eso.

¿Fue útil?

Solución

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 vez?

La aplicación parece un poco no estándar, sin embargo; Del ejemplo aquí :

    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);
    }
}

Otros consejos

Sé que esto es un hilo muy antiguo, pero mi solución a este problema fue la creación de un método de extensión de la SerializationInfo clase como esta:

namespace System.Runtime.Serialization
{
  public static class SerializationInfoExtensions
  {
    public static bool Exists(this SerializationInfo info, string name)
    {
      foreach (SerializationEntry entry in info)
        if (name == entry.Name)
          return true;
      return false;
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top