zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    成员对象和封闭类
    静态成员
    this指针
    类型构造构造函数
    拷贝构造函数
    C++
    矩阵快速幂求递推式
    对浅拷贝和深拷贝的基本理解
    传引用作为形参和返回值_节省参数拷贝的时间
    namespace的基本知识
  • 原文地址:https://www.cnblogs.com/bingjava/p/5705427.html
Copyright © 2011-2022 走看看