0
我使用URLClassLoader從jarfile加載類,然後序列化這些類的對象並將其保存在文件中。然後,當我去反序列化類ObjectInputStream拋出一個java.lang.ClassNotFoundException,並沒有找到我已經動態加載的類。我將如何反序列化加載的類?反序列化動態加載的類java
我使用URLClassLoader從jarfile加載類,然後序列化這些類的對象並將其保存在文件中。然後,當我去反序列化類ObjectInputStream拋出一個java.lang.ClassNotFoundException,並沒有找到我已經動態加載的類。我將如何反序列化加載的類?反序列化動態加載的類java
要使用自定義ClassLoader,您必須重寫resolveClass方法。下面是從JDK源爲例(這是不公開,但你可以用它爲靈感)
/**
* This subclass of ObjectInputStream delegates loading of classes to
* an existing ClassLoader.
*/
class ObjectInputStreamWithLoader extends ObjectInputStream
{
private ClassLoader loader;
/**
* Loader must be non-null;
*/
public ObjectInputStreamWithLoader(InputStream in, ClassLoader loader)
throws IOException, StreamCorruptedException {
super(in);
if (loader == null) {
throw new IllegalArgumentException("Illegal null argument to ObjectInputStreamWithLoader");
}
this.loader = loader;
}
/**
* Use the given ClassLoader rather than using the system class
*/
@SuppressWarnings("rawtypes")
protected Class resolveClass(ObjectStreamClass classDesc)
throws IOException, ClassNotFoundException {
String cname = classDesc.getName();
return ClassFinder.resolveClass(cname, this.loader);
}
}
感謝,這正是我需要的,我用這個基本骨架和修改決心類方法有「返回的Class.forName(classDesc.getName(),假的,裝載機);」它很好地工作,謝謝! – Ozaren
您需要反序列化中,知道如何找到這些類上下文的類。 –
我該怎麼做?我已經查看了ObjectInputStream的文檔,但是我找不到那樣的東西。 – Ozaren