Question

Étant donné une classe comme celle-ci:

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

Comment puis-je vérifier si une valeur pour le champ address existe avant d'appeler info.GetString(address)?

Oui, je comprends que je pourrais simplement écrire un champ address nul mais mon vrai problème est que les versions antérieures de MyClass, ne disposaient pas d'un champ d'adresse.

Remarque: J'ai de bonnes raisons d'utiliser sérialisation personnalisé. Il y a des champs statiques qui sont utilisés comme singletons et la désérialisation par défaut ne respecte.

Était-ce utile?

La solution

Eh bien, une approche intéressante est que vous pouvez utiliser :

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

Mais il semble que vous pouvez également utiliser 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);
    }
}

Autres conseils

Je sais que c'est un fil très vieux, mais ma solution à ce problème était de créer une méthode d'extension du SerializationInfo classe comme ceci:

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;
    }
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top