OSGi运行环境下java反序列化问题的解决方式

 

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, 2016725

* @since 1.6, 2016725

*/

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();

posted @ 2016-07-25 21:38  bingjava  阅读(461)  评论(0编辑  收藏  举报