Блок, который Вы передаете define_method, может включать некоторые параметры. Это - то, как Ваш определенный метод принимает аргументы. При определении метода, Вы действительно просто называете блок и сохраняете ссылку на него в классе. Параметры идут с блоком. Так:
define_method(:say_hi) { |other| puts "Hi, " + other }
Добавьте новое _ fieldErrors
под другим именем, например _fieldErrors2
, и сделайте его [Необязательно]
. Затем реализуйте метод [OnDeserialized]
, который копирует данные из _fieldErrors
в _fieldErrors2
(если есть) и очищает _fieldErrors.
Если данные используются только для внутренних целей, моей первой мыслью было бы написать какой-нибудь простой код на выброс, чтобы десериализовать ваши двоичные данные, используя старую "NameValueCollection", сопоставить его со словарём и повторно сериализуйте его. Даже если на обработку всех данных уйдет несколько дней, не стоит внедрять патч в ваш новый код для поддержки старых данных.
Даже если он используется не только для внутренних целей, импортер кажется как самый простой способ.
В дополнение к хорошему совету OlivierD я бы посоветовал вам определить оба класса, но сначала попытайтесь десериализовать как текущую версию. В блоке catch десериализуйте его как устаревшую версию, затем обновите до текущей и сохраните обратно. Если экземпляров устаревшей версии не существует, код можно удалить.
Изучив несколько вариантов, я сделал следующие выводы:
В идеале я мог бы получить доступ к значению из исходного NameValueCollection
и вручную преобразовать его в Dictionary
. Единственный способ сделать это - реализовать ISerializable
, но при этом возникли две основные проблемы: сопоставление с именованием унаследованных данных и включение логики сериализации для всех наследуемых классов (которых сотни ).
По сути, это поставило меня в тупик. К счастью, я смог определить, что это поле действительно используется только как сводка ошибок проверки формы и не должно сериализоваться в первую очередь,