Вам необходимо реализовать пользовательский SerializationBinder
.Переопределите метод BindToType
, чтобы выбрать тип для загрузки на основе его имени:
public override Type BindToType(string assemblyName, string typeName)
{
if (assemblyName == "MyOldAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
{
if (typeName == "MyOldNamespace.MyOldClass")
{
return typeof(MyNewClass);
}
}
// Fall back to the default behavior, which will throw
// a SerializationException if the old assembly can't be found
return null;
}
(это очень простая реализация, в реальном сценарии вы, вероятно, будете использоватьулучшенная логика сопоставления).
Вы также можете переопределить BindToName
, если вам нужно повторно выполнить сериализацию данных, чтобы они могли быть прочитаны старой сборкой.Это позволяет вам настроить сборку и имя типа сериализованного объекта.
После того, как у вас есть пользовательский SerializationBinder
, вам просто нужно присвоить его свойству Binder
объектаотформатируйте, и используйте его оттуда как обычно.
Если вам нужно изменить структуру типов (добавить или переименовать поля, изменить типы ...), вам нужно будет реализовать ISerializationSurrogate
для сопоставления старых данных с новой структурой типа.