在OSGi环境下采用以下方式对其它bundle的类进行反序列化时,会出现ClassNotFoundException异常。
ByteArrayInputStream bi = new ByteArrayInputStream(bytes); ObjectInputStream oi = new ObjectInputStream(bi); Object obj = oi.readObject(); |
经检查java.io.ObjectInputStream.resolveClass(ObjectStreamClass desc)发现采用的classloader为最后一次使用的classloader,其源代码如下:
return Class.forName(name, false, latestUserDefinedLoader()); |
latestUserDefinedLoader为私有方法,因此我们可以通过重写resolveClass方法来实现自定义类加载器,比如可以采用线程上下文类加载器。代码如下:
/** * osgi环境下的对象反序列化. * @author lenglinyong@ysstech.com * @version 1.0, 2016年7月25日 * @since 1.6, 2016年7月25日 */ public class BundleObjectInputStream extends ObjectInputStream { @Override protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { String name = desc.getName(); try { return Class.forName(name, false, Thread.currentThread().getContextClassLoader()); } catch (ClassNotFoundException ex) { throw ex; } } |
反序列化时代码:
ByteArrayInputStream bi = new ByteArrayInputStream(bytes); BundleObjectInputStream oi = new BundleObjectInputStream(bi); Object obj = oi.readObject(); |