Question

Nous travaillons sur la libération de la version 2.0 d'un de nos produits, et nous voulons maintenir la compatibilité des fichiers avec la base installée de la version 1.0 clients. Je suis sur la plupart ISerializable la mise en œuvre des types dans notre application, et semble avoir frappé un accroc.

J'ai un type, permet de l'appeler la famille pour le bien de la discussion

[Serializable]
public class Family : 
    IDisposable,
    INotifyPropertyChanged
{
    private string m_Address;
    //....
    private List<Name> m_People;
    //...
}

Voici ce qui a été expédié comme la version 1.0, en 2.0, nous avons changé la classe Nom à une personne, qui est effectivement le même, mais il a un constructeur un peu différent, et de toute évidence un autre nom.

[Serializable]
public class Family : 
    IDisposable,
    INotifyPropertyChanged,
    ISerializabe
{
    private string m_Address;
    //....
    private List<Person> m_People;
    //...

    private Family(SerializationInfo info, StreamingContext context)
    {
        m_Address = info.GetString("m_Address");
        m_People = (List<Person>)info.GetValue("m_People", typeof(List<Person>));
    }

    // <<GetObjectData Method>>
}

Cela ne signifie évidemment pas le travail, le type « Nom » n'est plus dans l'assemblée, alors j'ai ajouté un SerializationBinder pour résoudre ce problème:

public sealed NamePersonSerializationBinder : SerializationBinder
{
    if (typeName.StartsWith("System.Collections.Generic.List`1[[Company.Name"))
        return typeof(List<Person>);
    else if (typeName.StartsWith("Company.Name"))
        return typeof(Person);
    else
        return null;
}

Cela fonctionne la plupart du temps, quand je désérialiser le obeject, le liant est appelé, retourne le type correct, mais le constructeur Désérialisation sur la personne ne sera jamais appelé. Aucune exception ne sont jetés, quelqu'un a des idées?

Était-ce utile?

La solution

Fixe! Il y a un type de base de la personne qui ne parvenait pas à terminer le constructeur de ce qui était à l'origine du constructeur de personne à ne jamais s'appeler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top