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

  • 相关阅读:
    数组中寻找和为X的两个元素
    JSP&Servlet学习笔记(一)
    自下而上的动态规划算法
    计数排序
    快速排序
    堆排序
    LeetCode-001题解
    算法不归路之最大子序列(C++版)
    算法不归路之插入排序(C版)
    互联网五层模型
  • 原文地址:https://www.cnblogs.com/bingjava/p/5705427.html
Copyright © 2020-2023  润新知