Pergunta

Dada uma classe como esta:

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

Como fazer teste I se um valor para o campo address existe antes de chamar info.GetString(address)?

Sim, eu entendo que eu poderia simplesmente escrever um campo nulo address mas meu verdadeiro problema é que as versões anteriores do MyClass, não tinha um campo de endereço.

Nota: eu tenho boas razões para usar serialização personalizada. Existem alguns campos estáticos que estão sendo usados ??como singletons ea desserialização padrão não vai respeitar isso.

Foi útil?

Solução

Bem, uma abordagem intrigante é que você pode usar GetEnumerator (foreach) para iterar sobre os pares nome / valor, usando um switch no nome para lidar com um de cada vez?

A implementação parece um não-padrão pouco, embora; a partir do exemplo aqui :

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

Mas parece que você também pode usar 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);
    }
}

Outras dicas

Eu sei que este é um segmento muito antiga, mas a minha solução para este problema foi criar um método de extensão do SerializationInfo classe como este:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top