Я не знаю всех подробностей о том, почему это происходит, как это происходит, но у меня есть решение / обходной путь для вас.(Я видел похожее поведение при передаче объектов, созданных на стороне ruby, на сторону Java.)
Насколько я могу судить, JRuby должен уже "увидеть" экземпляр класса, которым он являетсяпопытка разархивировать, прежде чем он сможет правильно понять сторону наследования Java.Как будто создание объекта в JRuby имеет недокументированный побочный эффект, который регистрирует необходимую иерархию наследования.Если это не очень хорошо сформулировано, то это потому, что я сам не понимаю этого!
Так что обходной путь - просто создать экземпляр OneClass
и TwoClass
перед выполнением демаршала.Если я изменю метод self.create
на следующий:
def self.create clazz
begin
clazz.new # <<< just create an instance and throw it away!
dump = IO.readlines("C:/#{clazz.to_s.rpartition('::')[2]}.txt", '').to_s
instance = Marshal.load dump
rescue => err
puts err.message
instance = clazz.new
dump = Marshal.dump instance
File.open("C:/#{clazz.to_s.rpartition('::')[2]}.txt", 'w') { |f| f.write dump }
end
instance
end
, то результат двух проходов будет следующим:
Первый проход
No such file or directory - C:/OneClass.txt
No such file or directory - C:/TwoClass.txt
#<MMM::OneClass:0x4de6f0ef>
#<MMM::TwoClass:0x4526ba64>
22
22
false
true
22
22
true
false
Второйpass
#<MMM::OneClass:0x4858cca9>
#<MMM::TwoClass:0x3de4905a>
22
22
false
true
22
22
true
false
Согласно этому сообщению об ошибке это исправлено в JRuby 1.7.Стоит отметить, что, хотя в комментариях к отчету говорится, что обходной путь заключается в вызове метода с передачей экземпляра объекта, похоже, что предварительного создания объекта достаточно.