`

在不同的classloader之间进行对象的序列化和反序列化

阅读更多

在同一个classloader中,利用如下的方法serializabale和deserializable对象:

  ByteArrayOutputStream bo=new ByteArrayOutputStream();

  ObjectOutputStream oo=new ObjectOutputStream(bo);
  oo.writeObject(outObject);

 

   ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
  ObjectInputStream oi=new ObjectInputStream(bi);
  Object inObject = oi.readObject();
    当序列化的对象和反序列化的对象不在同一个classloader中时,以上的代码执行时,就会报无法把属性付给对象的错误,此时应当,通过设置反序列化得classloader,来解决这个问题。

  首先,从ObjectInputStream继承一个自己的ObjectInputStream:

public class CustomObjectInputStream extends ObjectInputStream {

 protected ClassLoader classLoader = this.getClass().getClassLoader();

 /**
  * @param in
  * @throws IOException
  */
 public CustomObjectInputStream(InputStream in) throws IOException {
  super(in);
  // TODO Auto-generated constructor stub
 }

 public CustomObjectInputStream(InputStream in, ClassLoader cl)
   throws IOException {
  super(in);
  // TODO Auto-generated constructor stub
  this.classLoader = cl;
 }

 /*
  * (non-Javadoc)
  *
  * @see java.io.ObjectInputStream#resolveClass(java.io.ObjectStreamClass)
  */
 @Override
 protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException,
   ClassNotFoundException {
  // TODO Auto-generated method stub
  String name = desc.getName();
  try {
   return Class.forName(name, false, this.classLoader);
  } catch (ClassNotFoundException ex) {
   return super.resolveClass(desc);
  }
 }

}

然后在反序列化时,把序列化对象的classloader的传入:

 

 

ByteArrayOutputStream bo=new ByteArrayOutputStream();

ObjectOutputStream oo=new ObjectOutputStream(bo);
oo.writeObject(outObject);

 

   ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());

   CustomObjectInputStream oi=new CustomObjectInputStream(bi,outObject.getClass().getClassLoader());
  
   Object = oi.readObject();

 

分享到:
评论

相关推荐

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

    基于Java的XML解析与反射设计模式.doc

    和其他序列化工具相比,xstream 有三个突出的特点: xstream不关心序列化/逆序列化的类的字段的可见性。 序列化/逆 序列化类的字段不需要getter和setter 方法。 序列化/逆序列化的类不需要有默认构造函数。 不需要...

    fills-dubbo-Tools.rar

    dubbo接口测试工具源码,应用技术如下 A.类加载器-加载需要dubbo服务接口jar B.动态代理-订阅消费者...反序列化-fastJson实现对象序列化,反序列化 E.缓存-jvm缓存消费者服务,方法参数等信息,jvm缓存页面请求参数信息

    超级有影响力霸气的Java面试题大全文档

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】Java序列化与反序列化 27 为什么需要序列化与反序列化 28 如何实现Java序列化与反序列化 28 【基础】String s = new String("xyz");创建了几个字符串对象 30 【基础】接口是否可继承(extends)接口?抽象类...

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    day020-继承加强和设计模式代码和笔记.rar

    一般用饿汉模式,如果有序列化(自己百度扩展)要求,用枚举。 7. 不需要频繁创建对象的时候;不允许多个对象 用单例 2. 装饰者模式:(了解) 装饰者模式指的是在不必改变原类(Input)文件和...

    Android静默安装常用工具类

    序列化工具类,可用于序列化对象到文件或从文件反序列化对象,如: deserialization(String filePath) 从文件反序列化对象 serialization(String filePath, Object obj) 序列化对象到文件 源码可见SerializeUtils....

    基于javatcpsocket通信的拆包和装包源码-someData:存放一些思维导图,图片,ppt等等

    基于java tcp socket通信的拆包和装包源码 someData 存放一些思维导图,图片,ppt等等 Java知识点 1. 基本语法和对象概念,异常,反射等 关键字保留字的基本概念 基础类型用法,各自占据的字节 ...序列化,

    JAVA核心知识点整理(有效)

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

Global site tag (gtag.js) - Google Analytics