Problema con liste di tipo personalizzato e serializzazione
-
15-10-2019 - |
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?
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.