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

  • 相关阅读:
    三次请求(读-改-读)引出nibernate 一级缓存
    算法竞赛入门经典第一、二章摘记
    uva 10905 Children's Game
    uva 11205 The broken pedometer
    uva 10160 Servicing stations
    uva 208 Firetruck
    uva 167 The Sultan's Successors
    zoj 1016 Parencodings
    uva 307 Sticks
    uva 216 Getting in Line
  • 原文地址:https://www.cnblogs.com/bingjava/p/5705427.html
Copyright © 2011-2022 走看看