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

  • 相关阅读:
    winform解析json API数据
    c#(winform)获取本地打印机
    winform程序post提交数据API
    C#关于panle重叠
    net面试总结的题目
    委托
    最实用JS 留着学习
    dev 控件获得所有的EFDEVGRID
    c#利用WebClient和WebRequest获取网页源代码的比较
    浅谈.Net WebService开发
  • 原文地址:https://www.cnblogs.com/bingjava/p/5705427.html
Copyright © 2011-2022 走看看