Wir arbeiten an der Freigabe von Version 2.0 eines unserer Produkte, und wir möchten Dateikompatibilität mit der installierten Basis von Version 1.0-Kunden beibehalten. Ich habe ISerializable auf den meisten Typen in unserer Anwendung implementiert und scheint einen Haken gefunden zu haben.Problem mit Listen von benutzerdefinierten Typen und Serialisierung
ich einen Typ haben, nennen wir es Familie aus Gründen der Diskussion
[Serializable]
public class Family :
IDisposable,
INotifyPropertyChanged
{
private string m_Address;
//....
private List<Name> m_People;
//...
}
Dies ist, was als Version 1.0 ausgeliefert wurde, in 2,0 wir den Namen der Klasse zu einer Person verändert, die effektiv ist die gleiche , hat aber einen etwas anderen Konstruktor und offensichtlich einen anderen Namen.
[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>>
}
Das ist offensichtlich nicht funktioniert, der Typ „Name“ ist nicht mehr in der Versammlung, so fügte ich eine SerializationBinder das beheben:
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;
}
Diese meist funktioniert, wenn ich die Deserialize object, der Binder wird aufgerufen, gibt den richtigen Typ zurück, aber der Deserialization Constructor on Person wird nie aufgerufen. Keine Ausnahmen werden geworfen, hat jemand irgendwelche Ideen?