Domanda

Stiamo lavorando a rilasciare la versione 2.0 di uno dei nostri prodotti, e noi vogliamo mantenere la compatibilità dei file con la base installata di versione 1.0 clienti. Ho messo in atto ISerializable sulla maggior parte dei tipi nella nostra applicazione, e sembra di aver colpito un intoppo.

Ho un tipo, consente di chiamare famiglia per amore di discussione

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

Questo è ciò che è stato spedito come versione 1.0, in 2,0 abbiamo cambiato la classe particolare a una persona, che è effettivamente la stessa, ma ha un costruttore di leggermente diverso, e, ovviamente, un nome diverso.

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

Questo non lo fa, ovviamente, il lavoro, il tipo di "Nome" non è più nel gruppo, così ho aggiunto un SerializationBinder di correzione che:

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

Questo funziona per lo più, quando ho deserializzare l'obeject, il legante è chiamato, restituisce il tipo corretto, ma la deserializzazione Constructor sulla persona non viene mai chiamato. Nessuna eccezione vengono gettati, Qualcuno ha qualche idea?

È stato utile?

Soluzione

fissi! C'è un tipo di base di persona che non riusciva a finirlo del costruttore, che stava causando la persona costruttore per ottenere mai chiamato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top