Skip to content

[Java][Native Image] Unable to serialize subclasses (java.lang.NoSuchFieldException) #2668

@gudzpoz

Description

@gudzpoz

Search before asking

  • I had searched in the issues and found no similar issues.

Version

OS: ArchLinux (6.16.7-zen1-1-zen)
Fory: 'org.apache.fory:fory-core:0.13.0-SNAPSHOT'
Failing JDK: GraalVM 23.0.2+7.1 (build 23.0.2+7-jvmci-b01)

Component(s)

Java

Minimal reproduce step

Clone the reproducer project

Reproducing steps:

$ git checkout subclass-fields
$ ./gradlew run # pass
$ ./gradlew nativeCompile
$ app/build/native/nativeCompile/test # fail
java.lang.NoSuchFieldException: s
  ...
Full log
java.lang.NoSuchFieldException: s
        at java.base@23.0.2/java.lang.Class.checkField(DynamicHub.java:1133)
        at java.base@23.0.2/java.lang.Class.getDeclaredField(DynamicHub.java:1275)
        at org.example.App_AppInnerImplForyRefCodec_0.<clinit>(App_AppInnerImplForyRefCodec_0.java:33)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.methodhandles.Util_java_lang_invoke_MethodHandle.invokeInternal(Target_java_lang_invoke_MethodHandle.java:241)
        at java.base@23.0.2/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:102)
        at java.base@23.0.2/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:0)
        at java.base@23.0.2/java.lang.invoke.Invokers$Holder.invoke_MT(Invokers$Holder)
        at org.apache.fory.serializer.Serializers.newSerializer(Serializers.java:101)
        at org.apache.fory.resolver.ClassResolver.createSerializer(ClassResolver.java:1402)
        at org.apache.fory.resolver.ClassResolver.getClassInfo(ClassResolver.java:1276)
        at org.example.AppForyRefCodec_0.writeClassAndObject$(AppForyRefCodec_0.java:61)
        at org.example.AppForyRefCodec_0.write(AppForyRefCodec_0.java:71)
        at org.apache.fory.Fory.writeData(Fory.java:661)
        at org.apache.fory.Fory.write(Fory.java:412)
        at org.apache.fory.Fory.serialize(Fory.java:332)
        at org.apache.fory.Fory.serialize(Fory.java:286)
        at org.example.App.main(App.java:22)
        at java.base@23.0.2/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
Exception in thread "main" org.apache.fory.exception.SerializationException: java.lang.ExceptionInInitializerError
        at org.apache.fory.Fory.processSerializationError(Fory.java:369)
        at org.apache.fory.Fory.serialize(Fory.java:338)
        at org.apache.fory.Fory.serialize(Fory.java:286)
        at org.example.App.main(App.java:22)
        at java.base@23.0.2/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
Caused by: java.lang.ExceptionInInitializerError
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.methodhandles.Util_java_lang_invoke_MethodHandle.invokeInternal(Target_java_lang_invoke_MethodHandle.java:241)
        at java.base@23.0.2/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:102)
        at java.base@23.0.2/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:0)
        at java.base@23.0.2/java.lang.invoke.Invokers$Holder.invoke_MT(Invokers$Holder)
        at org.apache.fory.serializer.Serializers.newSerializer(Serializers.java:101)
        at org.apache.fory.resolver.ClassResolver.createSerializer(ClassResolver.java:1402)
        at org.apache.fory.resolver.ClassResolver.getClassInfo(ClassResolver.java:1276)
        at org.example.AppForyRefCodec_0.writeClassAndObject$(AppForyRefCodec_0.java:61)
        at org.example.AppForyRefCodec_0.write(AppForyRefCodec_0.java:71)
        at org.apache.fory.Fory.writeData(Fory.java:661)
        at org.apache.fory.Fory.write(Fory.java:412)
        at org.apache.fory.Fory.serialize(Fory.java:332)
        ... 3 more
Caused by: java.lang.RuntimeException: java.lang.NoSuchFieldException: s
        at org.example.App_AppInnerImplForyRefCodec_0.<clinit>(App_AppInnerImplForyRefCodec_0.java:38)
        ... 15 more
Caused by: java.lang.NoSuchFieldException: s
        at java.base@23.0.2/java.lang.Class.checkField(DynamicHub.java:1133)
        at java.base@23.0.2/java.lang.Class.getDeclaredField(DynamicHub.java:1275)
        at org.example.App_AppInnerImplForyRefCodec_0.<clinit>(App_AppInnerImplForyRefCodec_0.java:33)
        ... 15 more

And here is a reproducing GitHub workflow run: https://github.com/gudzpoz/fory-native-image-reproducer/actions/runs/18032933147/job/51313299236

What did you expect to see?

The test should pass.

What did you see instead?

Failure (java.lang.NoSuchFieldException) during serialization.

Anything Else?

This is really strange. When I was met with this issue, I was actually trying to reproduce another issue where the code [1] had no problem serializing subclasses...

[1] https://github.com/gudzpoz/Juicemacs/blob/7831b2cbe2dff97ccd503d0c32226ee18f8d93c0/elisp/src/main/java/party/iroiro/juicemacs/elisp/forms/coding/ELispCodingSystem.java#L15-L18

Are you willing to submit a PR?

  • I'm willing to submit a PR!

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions