栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

readResolve无法正常工作?:Guava的SerializedForm的一个实例出现

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

readResolve无法正常工作?:Guava的SerializedForm的一个实例出现

这周,我们再次遇到了这个错误。但我找到了根本原因。ObjectInputStream使用的类加载器是高度依赖上下文的(有人会说不 确定性
)。这是Sun文档的相关部分(摘自ObjectInputStream#resolveClass(ObjectStreamClass)):

[class loader]的确定如下:如果当前线程的堆栈上有一个方法的声明类是由用户定义的class
loader定义的(并且不是为实现反射调用而生成的),则它是class
loader对应于最接近当前执行帧的这种方法;否则为null。如果此调用导致ClassNotFoundException且传递的ObjectStreamClass实例的名称是原始类型或void的Java语言关键字,则将返回表示该原始类型或void的Class对象(例如,名称为“
int”的ObjectStreamClass
”将解析为Integer.TYPE)。否则,ClassNotFoundException将被抛出给该方法的调用者。

在我们的应用程序中,我们有一个Eclipse插件B,它依赖于仅实用程序的插件A。我们正在反序列化其类在B中的对象,但是反序列化是在A中启动的(在那里创建ObjectInputStream),这就是问题所在。反序列化很少(即取决于文档所说的调用堆栈)选择了错误的类加载器(一个不能加载B类的加载器)。为了解决此问题,我们将适当的加载程序从顶级反序列化调用程序(在B中)传递给A中的Utility方法。此方法现在使用如下的自定义ObjectInputStream(请注意,自由变量“
loader”):

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)) {     @SuppressWarnings("rawtypes")     @Override     protected Class resolveClass(ObjectStreamClass objectStreamClass)  throws IOException, ClassNotFoundException {         return Class.forName(objectStreamClass.getName(), true, loader);     } };


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/451444.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号