Java JRuby:反序列化输入流中的数据类型引发强制转换错误
这将导致Java JRuby:反序列化输入流中的数据类型引发强制转换错误,java,serialization,casting,jruby,Java,Serialization,Casting,Jruby,这将导致java.lang.ClassCastException错误。我对Java和JRuby都是新手,这对我的机会没有帮助 java端代码(简化) jruby端代码 最后一条语句抛出一个java.lang.ClassCastException,声称另一个java类(InstanceList)不能强制转换为ParallelTopicModel)。我还没有深入研究java端代码,但我猜测,InstanceList是我试图读取的文件中序列化的第一个对象的类型,基于我在编写序列化的代码中看到的内容 从
java.lang.ClassCastException
错误。我对Java和JRuby都是新手,这对我的机会没有帮助
java端代码(简化)
jruby端代码
最后一条语句抛出一个java.lang.ClassCastException
,声称另一个java类(InstanceList
)不能强制转换为ParallelTopicModel
)。我还没有深入研究java端代码,但我猜测,InstanceList
是我试图读取的文件中序列化的第一个对象的类型,基于我在编写序列化的代码中看到的内容
从我的IDE中轻松编辑的堆栈跟踪如下所示:
11007:恢复线程#
cc/mallet/topics/ParallelTopicModel.java:1997:inread':java.lang.ClassCastException:cc.mallet.types.InstanceList不能强制转换为cc.mallet.topics.ParallelTopicModel
来自java/lang/reflect/Method.java:606:in
invoke'
from/home/tom/RubymineProjects/casetager/baby jruby.rb:32:ininitialize'
from/home/tom/RubymineProjects/casetager/baby jruby.rb:54:in
(root)'
来自org/jruby/debug/rubydebuger.java:204:indebug\u load'
来自org/jruby/RubyKernel.java:1101:in
load'
from/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=新ObjectInputStream(新文件InputStream(f));
反序列化ObjectOfClassBlah=(Blah)ois.readObject()
Java中的cast using(Blah)的作用是让Java查找并调用私有的Blah.readObject方法。JRuby中的效果是JRuby尝试对它在流中找到的第一个非基本对象进行类型转换
如果有人遇到并解决了这个问题,我们非常欢迎您的想法。我仍然想找到一个解决方案。您是否可以发布整个堆栈跟踪,并指定它发生在哪一行?谢谢,但请使用堆栈跟踪编辑您的问题,而不是写评论。
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;
}
}
my_jruby_object = ParallelTopicModel::read(java.io.File.new(some_filename))