在同一个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();
分享到:
相关推荐
类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...
和其他序列化工具相比,xstream 有三个突出的特点: xstream不关心序列化/逆序列化的类的字段的可见性。 序列化/逆 序列化类的字段不需要getter和setter 方法。 序列化/逆序列化的类不需要有默认构造函数。 不需要...
dubbo接口测试工具源码,应用技术如下 A.类加载器-加载需要dubbo服务接口jar B.动态代理-订阅消费者...反序列化-fastJson实现对象序列化,反序列化 E.缓存-jvm缓存消费者服务,方法参数等信息,jvm缓存页面请求参数信息
引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...
【基础】Java序列化与反序列化 27 为什么需要序列化与反序列化 28 如何实现Java序列化与反序列化 28 【基础】String s = new String("xyz");创建了几个字符串对象 30 【基础】接口是否可继承(extends)接口?抽象类...
引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...
一般用饿汉模式,如果有序列化(自己百度扩展)要求,用枚举。 7. 不需要频繁创建对象的时候;不允许多个对象 用单例 2. 装饰者模式:(了解) 装饰者模式指的是在不必改变原类(Input)文件和...
序列化工具类,可用于序列化对象到文件或从文件反序列化对象,如: deserialization(String filePath) 从文件反序列化对象 serialization(String filePath, Object obj) 序列化对象到文件 源码可见SerializeUtils....
基于java tcp socket通信的拆包和装包源码 someData 存放一些思维导图,图片,ppt等等 Java知识点 1. 基本语法和对象概念,异常,反射等 关键字保留字的基本概念 基础类型用法,各自占据的字节 ...序列化,
25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................