繁体   English   中英

反序列化动态加载的类java

[英]deserialize dynamically loaded class java

我使用URLClassLoader从jar文件加载类,然后序列化这些类的对象并将其保存在文件中。 然后,当我去反序列化类时,ObjectInputStream抛出一个java.lang.ClassNotFoundException,并且找不到我动态加载的类。 我将如何反序列化已加载的类?

要使用自定义的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);
    }
}

apache commons在org.apache.commons.io.input.ClassLoaderObjectInputStream提供了此功能。 该代码与彼得建议的相同,但公开

从javadocs:

一个特殊的ObjectInputStream,它基于指定的ClassLoader而不是系统默认值加载类。

这在动态容器环境中很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM