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

  • 相关阅读:
    connect oralce
    monolog php
    js继承
    前后端交互-一些关于接口设计的思考
    zoom:1;
    H5的新特性及部分API详解
    软文参考
    seo细节
    seo每天要做的事情
    seo(每天要干的哪些事)
  • 原文地址:https://www.cnblogs.com/bingjava/p/5705427.html
Copyright © 2011-2022 走看看