Я создал объект, который не удалось маршалировать из-за «одноэлементного определения метакласса, выполняемого во время выполнения» (верно ли это описание того, что делает код?).
Это выполняется следующим кодом:
# define class X that my use singleton class metaprogramming features
# through call of method :break_marshalling!
class X
def break_marshalling!
meta_class = class << self
self
end
meta_class.send(:define_method, :method_y) do
return
end
end
end
# prepare my instance of X now
instance_of_x = X.new
# marshalling fine here
Marshal.dump instance_of_x
# break marshalling with metprogramming features
instance_of_x.break_marshalling!
Marshal.dump instance_of_x
# fails with TypeError: singleton can't be dumped
Что я могу сделать, чтобы правильно упорядочить объект? Можно ли «удалить» одноэлементные компоненты из class X
объекта instance_of_x
?
Мне действительно нужен совет по этому поводу, потому что некоторые из наших объектов необходимо кэшировать с помощью механизма сериализации Marshal.dump. Этот код выполняется в ruby-1.9.3, но я ожидаю, что он будет вести себя аналогично в ruby-2.0 или ruby-2.1.
singleton_class
. И нам не нужен этот хак отправки сdefine_singleton_method
вокруг. - person Max   schedule 20.05.2014remove_singleton_class_information!
возможно? ;) - person criess   schedule 21.05.2014