默认类加载器标识是否可序列化

时间:2012-10-02 11:34:51

标签: java serialization classloader

当一个类加载了一个自定义的ClassLoader时,它当然会遵循对结果对象的“getClassLoader()”方法的调用,默认情况下将返回自定义的ClassLoader。

如果相同的对象是序列化的,通过网络发送然后反序列化,我的查询会发生什么。将在Deserialised类上调用“getClassLoader()”仍返回自定义ClassLoader吗?

2 个答案:

答案 0 :(得分:2)

  

如果相同的对象是序列化的,通过网络发送然后反序列化,我的查询会发生什么。将在Deserialised类上调用“getClassLoader()”仍返回自定义ClassLoader吗?

类加载器未序列化。 getClassLoader()将为您提供ObjectInputStream正在使用的类加载器。


来自ObjectInputStream.resolveClass

ObjectInputStream中此方法的默认实现返回调用

的结果
 Class.forName(desc.getName(), false, loader)

其中loader的确定如下:如果当前线程的堆栈上有一个方法,其声明类是由用户定义的类加载器定义的(并且不是为实现反射调用而生成的),那么loader是类加载器对应的最接近当前执行帧的方法;否则,loader为null

答案 1 :(得分:1)

即可。您将类的实例与实际类本身混淆。必须在序列化对象反序列化之前加载该类。