Как я десериализовываю старые данные для типа, который изменился?

Блок, который Вы передаете define_method, может включать некоторые параметры. Это - то, как Ваш определенный метод принимает аргументы. При определении метода, Вы действительно просто называете блок и сохраняете ссылку на него в классе. Параметры идут с блоком. Так:

define_method(:say_hi) { |other| puts "Hi, " + other }
9
задан R. Martinho Fernandes 11 August 2009 в 14:39
поделиться

4 ответа

Добавьте новое _ fieldErrors под другим именем, например _fieldErrors2 , и сделайте его [Необязательно] . Затем реализуйте метод [OnDeserialized] , который копирует данные из _fieldErrors в _fieldErrors2 (если есть) и очищает _fieldErrors.

4
ответ дан 4 December 2019 в 21:50
поделиться

Если данные используются только для внутренних целей, моей первой мыслью было бы написать какой-нибудь простой код на выброс, чтобы десериализовать ваши двоичные данные, используя старую "NameValueCollection", сопоставить его со словарём и повторно сериализуйте его. Даже если на обработку всех данных уйдет несколько дней, не стоит внедрять патч в ваш новый код для поддержки старых данных.

Даже если он используется не только для внутренних целей, импортер кажется как самый простой способ.

3
ответ дан 4 December 2019 в 21:50
поделиться

В дополнение к хорошему совету OlivierD я бы посоветовал вам определить оба класса, но сначала попытайтесь десериализовать как текущую версию. В блоке catch десериализуйте его как устаревшую версию, затем обновите до текущей и сохраните обратно. Если экземпляров устаревшей версии не существует, код можно удалить.

2
ответ дан 4 December 2019 в 21:50
поделиться

Изучив несколько вариантов, я сделал следующие выводы:

В идеале я мог бы получить доступ к значению из исходного NameValueCollection и вручную преобразовать его в Dictionary . Единственный способ сделать это - реализовать ISerializable , но при этом возникли две основные проблемы: сопоставление с именованием унаследованных данных и включение логики сериализации для всех наследуемых классов (которых сотни ).

По сути, это поставило меня в тупик. К счастью, я смог определить, что это поле действительно используется только как сводка ошибок проверки формы и не должно сериализоваться в первую очередь,

0
ответ дан 4 December 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: