Frage

Wir arbeiten an der Veröffentlichung von Version 2.0 eines unserer Produkte und möchten die Dateikompatibilität mit der installierten Basis von Version 1.0 beibehalten. Ich habe iSerializable für die meisten Typen in unserer Anwendung implementiert und scheine einen Haken getroffen zu haben.

Ich habe einen Typ, nennen wir es für die Familie, um die Diskussion willen

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

Dies wurde als Version 1.0 ausgeliefert. In 2.0 haben wir die Namensklasse in eine Person geändert, was praktisch gleich ist, aber einen etwas anderen Konstruktor und offensichtlich einen anderen Namen hat.

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

Dies funktioniert offensichtlich nicht, der Typ "Name" befindet sich nicht mehr in der Baugruppe, daher habe ich einen Serialisierungsbinder hinzugefügt, um das zu 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;
}

Dies funktioniert hauptsächlich, wenn ich das Objekt des Objekts deserialisiere, wird der Bindemittel aufgerufen, gibt den richtigen Typ zurück, aber der Deserialisierungskonstruktor für Person wird nie aufgerufen. Es werden keine Ausnahmen geworfen, jemand hat irgendwelche Ideen?

War es hilfreich?

Lösung

Fest! Es gibt eine Basistyp von Person, die seinen Konstruktor nicht beendet hat, was dazu führte, dass der Personkonstruktor niemals angerufen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top