Проблема со списками пользовательского типа и сериализации
-
15-10-2019 - |
Вопрос
Мы работаем над выпуском версии 2.0 одного из наших продуктов, и мы хотим поддерживать совместимость с файлами с установленной базой клиентов версии 1.0. Я реализовал Iserializable по большинству типов в нашем приложении, и, похоже, попал в ловушку.
У меня есть тип, давайте назовем это семью ради обсуждения
[Serializable]
public class Family :
IDisposable,
INotifyPropertyChanged
{
private string m_Address;
//....
private List<Name> m_People;
//...
}
Это то, что было отправлено в качестве версии 1.0, в 2.0 мы изменили класс имени на человека, который фактически одинаков, но имеет немного другой конструктор, и, очевидно, другое имя.
[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>>
}
Это, очевидно, не работает, тип «имя» больше нет в сборке, поэтому я добавил сериализацию, чтобы исправить это:
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;
}
Это в основном работает, когда я десериализую объект, связующее связующее, возвращает правильный тип, но конструктор десериализации на человека никогда не вызывается. Никаких исключений не бросается, у кого -нибудь есть идеи?
Решение
Исправлено! Существует базовый тип человека, который не смог закончить свой конструктор, который заставлял человека конструктора никогда не вызвать.