JRuby:反序列化输入流中的数据类型会引发转换错误

时间:2014-11-16 13:29:56

标签: java serialization casting jruby

这会导致java.lang.ClassCastException错误。我是Java和JRuby的新手,这对我的机会没有帮助。

java端代码(简化)

public ParallelTopicModel implements Serializable {
    private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException          {
      ... bunch of stuff deserializing objects ...
    }

public static ParallelTopicModel read (File f) throws Exception {
    ParallelTopicModel goodThing = null;
    ObjectInputStream ois = new ObjectInputStream (new FileInputStream(f));
    goodThing = (ParallelTopicModel) ois.readObject();
    ois.close();
    return goodThing;
    }
}

jruby-side code

my_jruby_object = ParallelTopicModel::read(java.io.File.new(some_filename))

最后一个语句抛出java.lang.ClassCastException,声称​​另一个 java类(InstanceList)无法转换为ParallelTopicModel。我没有深入研究java端代码,但我猜测InstanceList是我尝试阅读的文件中序列化的第一个对象的类型,基于我在代码中看到的编写序列化的内容。

来自IDE的轻微编辑的堆栈跟踪如下所示:

11007:恢复线程# cc / mallet / topics / ParallelTopicModel.java:1997:在read': java.lang.ClassCastException: cc.mallet.types.InstanceList cannot be cast to cc.mallet.topics.ParallelTopicModel from java/lang/reflect/Method.java:606:in调用'     来自/home/tom/RubymineProjects/CaseTagger/baby-jruby.rb:32:in initialize' from /home/tom/RubymineProjects/CaseTagger/baby-jruby.rb:54:in(root)'     来自org / jruby / debug / RubyDebugger.java:204:在debug_load' from org/jruby/RubyKernel.java:1101:in中加载'     来自/home/tom/.rvm/gems/jruby-1.7.11/gems/ruby-debug-ide-0.4.23.beta1/bin/rdebug-ide:110:in`(root)'

我尝试过使用to_java及其类似的一些JRuby-ish技巧,但似乎反对是返回数据的类型。 Java代码(显然)不是我的,我当然不是Java程序员,但看起来演员的目的是强制使用ParallelTopicModel的readObject方法,但Jruby将其解释为试图将第一个对象的类型转换为序列化。

有什么想法吗?

(1周后)似乎是JRuby问题

我尝试了很多利用JRuby能力的东西(例如)调用蒙面和私有方法,强制打字等等。没有用过。我还查看了许多关于使用ObjectInputStream的Java教程(虽然以一种不太知情的方式,因为虽然我不是一个Ruby程序员,但我并不是一个Java程序员在所有)。我得出结论,在这个例子中使用强制转换是JRuby不理解的Java习语:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f)); deserializedObjectOfClassBlah =(Blah)ois.readObject();

在Java中使用(Blah)的强制转换的效果是Java要查找并调用私有的Blah.readObject方法。 JRuby中的效果是JRuby尝试输入它在流中找到的第一个非原始对象。

非常欢迎,如果有人遇到并解决了这个问题。我还是想找个解决方案。

0 个答案:

没有答案