Как с помощью BinaryFormatter десериализовать объект, содержащий несуществующее поле?

Скажем, я создал класс данных некоторое время назад:

[Serializable]
public class MyData
{
  public string name;
  public string nickname;
  public int id;
}

И я использовал BinaryFormatter для сериализации и сохранения данных пользователей в файл. По прошествии времени я решаю, что поле «псевдоним» нам больше не нужно, поэтому удаляю его:

[Serializable]
public class MyData
{
  public string name;
  public int id;
}

Однако теперь, когда я пытаюсь десериализовать объект, который был сериализован, когда он все еще содержал поле псевдонима, он выдает исключение:

System.Runtime.Serialization.SerializationException: поле «псевдоним» не найдено в классе MyData

Есть ли способ сообщить BinaryFormatter, что если он встретит псевдоним поля, просто проигнорирует его и десериализует остальные поля как обычно?


person inejwstine    schedule 26.10.2018    source источник
comment
Существуют возможные решения, но ни одно из них не похоже на простое решение (stackoverflow.com/questions/25108395/)   -  person Ryan Wilson    schedule 26.10.2018
comment
Вам придется вернуть его, если вы не хотите реализовывать ISerializable.   -  person Hans Passant    schedule 26.10.2018
comment
Вы можете рассмотреть возможность использования суррогата сериализации. Заголовок stackoverflow.com/questions/13166105/   -  person Cinchoo    schedule 26.10.2018


Ответы (1)


Нет, это невозможно. Что вам нужно сделать, так это десериализовать его в класс с той же структурой, что и раньше, затем вручную перенести старый объект в новый и сохранить новый объект на будущее.

person laptou    schedule 26.10.2018