Skip to content

Types from Java packages not loaded yet cannot be deserialized #379

Open

Description

@doublep

When trying to deserialize an object that refers to Java type from a package that has not been loaded yet, Jython (2.7.4) fails with an ImportError.

Code to reproduce:

new java.io.ObjectInputStream (new java.io.FileInputStream (new java.io.File ("..."))).readObject ();

Result (the binary blob refers to type java.awt.dnd.Autoscroll; chosen only as a member of a package unlikely to be loaded):

ImportError: No module named awt
    at app//org.python.core.Py.ImportError(Py.java:327)
    at app//org.python.core.imp.import_logic(imp.java:1292)
    at app//org.python.core.imp.import_module_level(imp.java:1371)
    at app//org.python.core.imp.importName(imp.java:1520)
    at app//org.python.core.PyType$TypeResolver.readResolve(PyType.java:2674)
    at java.base@21.0.5/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base@21.0.5/java.lang.reflect.Method.invoke(Method.java:580)
    at java.base@21.0.5/java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1192)
    at java.base@21.0.5/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2293)
    at java.base@21.0.5/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1762)
    at java.base@21.0.5/java.io.ObjectInputStream.readArray(ObjectInputStream.java:2186)
    at java.base@21.0.5/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1750)
    at java.base@21.0.5/java.io.ObjectInputStream$FieldValues.<init>(ObjectInputStream.java:2618)
    at java.base@21.0.5/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2469)
    at java.base@21.0.5/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2284)
    at java.base@21.0.5/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1762)
    at java.base@21.0.5/java.io.ObjectInputStream.readObject(ObjectInputStream.java:540)
    at java.base@21.0.5/java.io.ObjectInputStream.readObject(ObjectInputStream.java:498)

Store the file from the attachment somewhere and insert the path into the oneliner above. (Had to pack serialized-not-yet-loaded-package.bin into a dummy tarball, because GitHub doesn't accept .bin attachments.)

dat.tar.gz

Likely fix: in PyType.TypeResolver.readResolve() add a call to Class.forName() or something like that.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions