Проблема со списками пользовательского типа и сериализацией

Мы работаем над выпуском версии 2.0 одного из наших продуктов и хотим сохранить совместимость файлов с установленной базой клиентов версии 1.0. Я реализовал ISerializable для большинства типов в нашем приложении и, похоже, столкнулся с проблемой.

У меня есть Тип, назовем его Семейным ради обсуждения.

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

Это то, что было отправлено в версии 1.0, в версии 2.0 мы изменили класс Name на Person, который фактически такой же, но имеет немного другой конструктор и, очевидно, другое имя.

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

Очевидно, это не работает, типа «Имя» больше нет в сборке, поэтому я добавил SerializationBinder, чтобы исправить это:

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

В основном это работает, когда я десериализую объект, вызывается связующее, возвращает правильный тип, но конструктор десериализации для Person никогда не вызывается. Никаких исключений не выбрасывается, у кого-нибудь есть идеи?


person Brandon    schedule 04.01.2011    source источник


Ответы (1)


Исправлена! Существует базовый тип Person, который не мог завершить свой конструктор, что приводило к тому, что конструктор person никогда не вызывался.

person Brandon    schedule 04.01.2011