BinaryFormatter и измененный тип свойства

Мы должны изменить одно из наших свойств с целого числа, допускающего значение NULL, на строку. После изменения класса получаем исключение:

Объект типа «System.Int32» не может быть преобразован в тип «System.String».

Мы десериализуем объекты с помощью этого кода:

byte[] o =GetByteArray();
var binFormatter = new BinaryFormatter();
var memStream = new MemoryStream(o);
var obj = binFormatter.Deserialize(memStream);

Как проще всего работать со старыми объектами?


person user278618    schedule 14.11.2018    source источник
comment
Создайте новый тип вместо изменения старого.   -  person Jeroen van Langen    schedule 14.11.2018
comment
Нет простого пути, вам нужно создать новый класс. Из вопроса, как вы собираетесь конвертировать старые объекты Foo в Foov2, не очевидно, вам придется подумать об этом.   -  person Hans Passant    schedule 14.11.2018
comment
К сожалению, у нас есть миллионы файлов со старой структурой. Было бы непросто создать новый класс.   -  person user278618    schedule 14.11.2018
comment
Это всего лишь один класс, а не миллионы. Сосредоточьтесь на реальной проблеме, вам нужно избавиться от старых данных, в которых нет этой строки.   -  person Hans Passant    schedule 14.11.2018
comment
Ну, на самом деле это не только один класс. У класса есть другой класс как свойства с той же проблемой.   -  person user278618    schedule 14.11.2018


Ответы (1)


Попробуйте пользовательское свойство:

   public class MyClass
    {
        private string myString { get; set; }

        public int MyInt
        {
            get { return int.Parse(myString); }
            set { myString = value.ToString(); }
        }
    }
person jdweng    schedule 14.11.2018
comment
Спасибо за ваш ответ. Мы хотели бы остаться со старым названием. Есть много приложений, которые используют это поле. (тип для них не важен) - person user278618; 14.11.2018
comment
@ user278618, если тип не важен, зачем его менять? Вы можете добавить прокси-свойство, как в этом ответе, пометить его как несериализуемое и просто использовать для источников, которым требуется новый тип. - person icebat; 14.11.2018
comment
Один компонент получает данные из базы данных, а затем заполняет объект этими данными, а затем сериализует объект. Другие приложения читают файл, десериализуют его и используют для просмотра. Это единственное место, где тип не важен. Вместо того, чтобы вводить в каждое приложение новое поле, мы хотим изменить только то место, где мы десериализуем данные. - person user278618; 14.11.2018