This is an automated email from the ASF dual-hosted git repository.
chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory.git
The following commit(s) were added to refs/heads/main by this push:
new 29d3ba6c7 fix(java): retain serializers in graalvm native images
(#2680)
29d3ba6c7 is described below
commit 29d3ba6c7f06b5c6f5e6b53a16873b803abdafdf
Author: gudzpoz <[email protected]>
AuthorDate: Sun Sep 28 20:06:57 2025 +0800
fix(java): retain serializers in graalvm native images (#2680)
## Why?
Custom serializers are not retained during GraalVM native image builds.
## What does this PR do?
The original code checks against `initialClassInfos` and removes
serializers outside the set during native image builds. This PR removes
that as well as `initialClassInfos`.
I don't know what `initialClassInfos` is for, because it is only
involved in clearing serializers, which this PR is to remove.
Also, since the tests before weren't retaining some serializers, it
turns out the original `native-image.properties` might be incomplete.
And I added more classes to `--initialize-at-build-time` as is hinted by
the `native-image` command.
## Related issues
- Fixes #2669
---
.../fory/graalvm/EnsureSerializerExample.java | 72 ++++++++++++++++++++++
.../main/java/org/apache/fory/graalvm/Main.java | 1 +
.../graalvm_tests/native-image.properties | 2 +
.../org/apache/fory/resolver/ClassResolver.java | 17 -----
.../org/apache/fory/resolver/TypeResolver.java | 1 -
.../fory-core/native-image.properties | 10 +++
6 files changed, 85 insertions(+), 18 deletions(-)
diff --git
a/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/EnsureSerializerExample.java
b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/EnsureSerializerExample.java
new file mode 100644
index 000000000..fe6e17e78
--- /dev/null
+++
b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/EnsureSerializerExample.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.fory.graalvm;
+
+import org.apache.fory.Fory;
+import org.apache.fory.memory.MemoryBuffer;
+import org.apache.fory.serializer.Serializer;
+import org.apache.fory.util.Preconditions;
+
+public class EnsureSerializerExample {
+ static Fory fory;
+
+ static {
+ fory =
+ Fory.builder()
+ .withName(EnsureSerializerExample.class.getName())
+ .requireClassRegistration(true)
+ .build();
+ // register and generate serializer code.
+ fory.registerSerializer(Custom.class, new CustomSerializer(fory));
+ fory.register(EnsureSerializerExample.class);
+ fory.ensureSerializersCompiled();
+ }
+
+ public Custom custom = new Custom();
+
+ static void test(Fory fory) {
+ EnsureSerializerExample obj = new EnsureSerializerExample();
+ EnsureSerializerExample out = (EnsureSerializerExample)
fory.deserialize(fory.serialize(obj));
+ Preconditions.checkArgument(42 == out.custom.i);
+ }
+
+ public static void main(String[] args) {
+ test(fory);
+ System.out.println("EnsureSerializerExample succeed");
+ }
+
+ public static class Custom {
+ public int i = 42;
+ }
+
+ private static class CustomSerializer extends Serializer<Custom> {
+ public CustomSerializer(Fory fory) {
+ super(fory, Custom.class);
+ }
+
+ @Override
+ public void write(MemoryBuffer buffer, Custom value) {}
+
+ @Override
+ public Custom read(MemoryBuffer buffer) {
+ return new Custom();
+ }
+ }
+}
diff --git
a/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/Main.java
b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/Main.java
index 5d3f41050..d1e1591b8 100644
---
a/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/Main.java
+++
b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/Main.java
@@ -36,6 +36,7 @@ public class Main {
CompatibleThreadSafeExample.main(args);
ProxyExample.main(args);
ObjectStreamExample.main(args);
+ EnsureSerializerExample.main(args);
Benchmark.main(args);
CollectionExample.main(args);
ArrayExample.main(args);
diff --git
a/integration_tests/graalvm_tests/src/main/resources/META-INF/native-image/org.apache.fory/graalvm_tests/native-image.properties
b/integration_tests/graalvm_tests/src/main/resources/META-INF/native-image/org.apache.fory/graalvm_tests/native-image.properties
index 19545d78a..60369d682 100644
---
a/integration_tests/graalvm_tests/src/main/resources/META-INF/native-image/org.apache.fory/graalvm_tests/native-image.properties
+++
b/integration_tests/graalvm_tests/src/main/resources/META-INF/native-image/org.apache.fory/graalvm_tests/native-image.properties
@@ -28,6 +28,8 @@ Args=-H:+ReportExceptionStackTraces \
org.apache.fory.graalvm.CompatibleThreadSafeExample,\
org.apache.fory.graalvm.ProxyExample,\
org.apache.fory.graalvm.ObjectStreamExample,\
+ org.apache.fory.graalvm.EnsureSerializerExample,\
+ org.apache.fory.graalvm.EnsureSerializerExample$CustomSerializer,\
org.apache.fory.graalvm.CollectionExample,\
org.apache.fory.graalvm.ArrayExample,\
org.apache.fory.graalvm.Benchmark,\
diff --git
a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
index 453f4de3a..4f7e5bcc3 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
@@ -271,14 +271,6 @@ public class ClassResolver extends TypeResolver {
addDefaultSerializers();
shimDispatcher.initialize();
innerEndClassId = extRegistry.classIdGenerator;
- if (GraalvmSupport.isGraalBuildtime()) {
- classInfoMap.forEach(
- (cls, classInfo) -> {
- if (classInfo.serializer != null) {
- extRegistry.initialClassInfos.add(classInfo);
- }
- });
- }
}
private void addDefaultSerializers() {
@@ -1802,15 +1794,6 @@ public class ClassResolver extends TypeResolver {
}
}
});
- if (GraalvmSupport.isGraalBuildtime()) {
- classInfoMap.forEach(
- (cls, classInfo) -> {
- if (classInfo.serializer != null
- && !extRegistry.initialClassInfos.contains(classInfo)) {
- classInfo.serializer = null;
- }
- });
- }
classInfoCache = NIL_CLASS_INFO;
} finally {
fory.getJITContext().unlock();
diff --git
a/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
b/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
index 69ab9f209..4bfb54431 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
@@ -697,7 +697,6 @@ public abstract class TypeResolver {
final IdentityMap<Type, GenericType> genericTypes = new IdentityMap<>();
final Map<Class, Map<String, GenericType>> classGenericTypes = new
HashMap<>();
final Map<List<ClassLoader>, CodeGenerator> codeGeneratorMap = new
HashMap<>();
- final Set<ClassInfo> initialClassInfos = new HashSet<>();
boolean ensureSerializersCompiled;
}
}
diff --git
a/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
b/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
index 773687906..3f4efe975 100644
---
a/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
+++
b/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
@@ -307,6 +307,9 @@
Args=--initialize-at-build-time=org.apache.fory.memory.MemoryBuffer,\
org.apache.fory.serializer.ArraySerializers$ShortArraySerializer,\
org.apache.fory.serializer.ArraySerializers$StringArraySerializer,\
org.apache.fory.serializer.ArraySerializers,\
+ org.apache.fory.serializer.BufferSerializers$ByteBufferSerializer,\
+ org.apache.fory.serializer.CompatibleSerializer,\
+ org.apache.fory.serializer.EnumSerializer,\
org.apache.fory.serializer.collection.SubListSerializers,\
org.apache.fory.serializer.collection.SubListSerializers$SubListViewSerializer,\
org.apache.fory.serializer.collection.SubListSerializers$SubListSerializer,\
@@ -346,6 +349,7 @@
Args=--initialize-at-build-time=org.apache.fory.memory.MemoryBuffer,\
org.apache.fory.serializer.ReplaceResolveSerializer$1,\
org.apache.fory.serializer.ReplaceResolveSerializer$ReplaceStub,\
org.apache.fory.serializer.ReplaceResolveSerializer,\
+ org.apache.fory.serializer.ReplaceResolveSerializer$MethodInfoCache,\
org.apache.fory.serializer.ReplaceResolveSerializer$ReplaceResolveInfo,\
org.apache.fory.serializer.Serializers$AtomicBooleanSerializer,\
org.apache.fory.serializer.Serializers$AtomicIntegerSerializer,\
@@ -394,7 +398,9 @@
Args=--initialize-at-build-time=org.apache.fory.memory.MemoryBuffer,\
org.apache.fory.serializer.collection.CollectionSerializers$EmptyListSerializer,\
org.apache.fory.serializer.collection.CollectionSerializers$EmptySetSerializer,\
org.apache.fory.serializer.collection.CollectionSerializers$EmptySortedSetSerializer,\
+
org.apache.fory.serializer.collection.CollectionSerializers$EnumSetSerializer,\
org.apache.fory.serializer.collection.CollectionSerializers$HashSetSerializer,\
+
org.apache.fory.serializer.collection.CollectionSerializers$JDKCompatibleCollectionSerializer,\
org.apache.fory.serializer.collection.CollectionSerializers$LinkedHashSetSerializer,\
org.apache.fory.serializer.collection.CollectionSerializers$PriorityQueueSerializer,\
org.apache.fory.serializer.collection.CollectionSerializers$SetFromMapSerializer,\
@@ -458,7 +464,10 @@
Args=--initialize-at-build-time=org.apache.fory.memory.MemoryBuffer,\
org.apache.fory.serializer.converter.FieldConverters$StringConverter,\
org.apache.fory.serializer.ObjectStreamSerializer,\
org.apache.fory.serializer.ObjectStreamSerializer$1,\
+ org.apache.fory.serializer.ObjectStreamSerializer$ForyObjectInputStream,\
+ org.apache.fory.serializer.ObjectStreamSerializer$ForyObjectOutputStream,\
org.apache.fory.serializer.ObjectStreamSerializer$StreamClassInfo,\
+ org.apache.fory.serializer.ObjectStreamSerializer$SlotsInfo,\
org.apache.fory.serializer.collection.ChildContainerSerializers$ChildCollectionSerializer,\
org.apache.fory.serializer.collection.ChildContainerSerializers$ChildMapSerializer,\
org.apache.fory.shaded.org.codehaus.janino.IClass$1,\
@@ -479,6 +488,7 @@
Args=--initialize-at-build-time=org.apache.fory.memory.MemoryBuffer,\
org.apache.fory.util.DelayedRef,\
org.apache.fory.util.function.Functions,\
org.apache.fory.util.GraalvmSupport,\
+ org.apache.fory.util.GraalvmSupport$GraalvmSerializerHolder,\
org.apache.fory.util.LoaderBinding$1,\
org.apache.fory.util.LoaderBinding$StagingType,\
org.apache.fory.util.LoaderBinding,\
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]