This is an automated email from the ASF dual-hosted git repository. chaokunyang pushed a commit to branch releases-0.12 in repository https://gitbox.apache.org/repos/asf/fory.git
commit 90ee6fcb2e095fe0f26f800377570c7c14c05db7 Author: chaokunyang <[email protected]> AuthorDate: Fri Sep 19 20:15:12 2025 +0800 fix get nested genericTypeInStruct --- .../org/apache/fory/resolver/ClassResolver.java | 13 ++--------- .../java/org/apache/fory/type/GenericType.java | 4 ++++ .../main/java/org/apache/fory/type/TypeUtils.java | 26 ++++++++++++++++++++++ .../serializer/collection/MapSerializersTest.java | 26 ++++++++++++++++++++++ 4 files changed, 58 insertions(+), 11 deletions(-) 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 471a6069e..11c43233f 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 @@ -2067,17 +2067,8 @@ public class ClassResolver implements TypeResolver { @CodegenInvoke public GenericType getGenericTypeInStruct(Class<?> cls, String genericTypeStr) { Map<String, GenericType> map = - extRegistry.classGenericTypes.computeIfAbsent(cls, k -> new HashMap<>()); - GenericType genericType = map.get(genericTypeStr); - if (genericType == null) { - for (Field field : ReflectionUtils.getFields(cls, true)) { - Type type = field.getGenericType(); - TypeRef<Object> typeRef = TypeRef.of(type); - genericType = buildGenericType(typeRef); - map.put(type.getTypeName(), genericType); - } - } - return genericType; + extRegistry.classGenericTypes.computeIfAbsent(cls, TypeUtils::buildGenericMap); + return map.get(genericTypeStr); } @Override diff --git a/java/fory-core/src/main/java/org/apache/fory/type/GenericType.java b/java/fory-core/src/main/java/org/apache/fory/type/GenericType.java index f5e7333f4..36c9a3eb7 100644 --- a/java/fory-core/src/main/java/org/apache/fory/type/GenericType.java +++ b/java/fory-core/src/main/java/org/apache/fory/type/GenericType.java @@ -166,6 +166,10 @@ public class GenericType { return typeRef; } + public Type getType() { + return typeRef.getType(); + } + public Class<?> getCls() { return cls; } diff --git a/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java b/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java index 2095d2000..b47a45419 100644 --- a/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java +++ b/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java @@ -909,4 +909,30 @@ public class TypeUtils { return false; }); } + + /** + * Build a map of nested generic type name to generic type for all fields in the class. + * + * @param cls the class to build the map of nested generic type name to generic type for all + * fields in the class + * @return a map of nested generic type name to generic type for all fields in the class + */ + public static Map<String, GenericType> buildGenericMap(Class<?> cls) { + Map<String, GenericType> map = new HashMap<>(); + for (Field field : ReflectionUtils.getFields(cls, true)) { + Type type = field.getGenericType(); + GenericType genericType = GenericType.build(type); + if (map.containsKey(type.getTypeName())) { + continue; + } + map.put(type.getTypeName(), genericType); + for (GenericType t : genericType.getTypeParameters()) { + if (map.containsKey(t.getType().getTypeName())) { + continue; + } + map.put(t.getType().getTypeName(), GenericType.build(t.getType())); + } + } + return map; + } } diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java index b19b76e26..4e00a7953 100644 --- a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java +++ b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java @@ -1048,4 +1048,30 @@ public class MapSerializersTest extends ForyTestBase { State state2 = (State) fory2.deserialize(bytes); Assert.assertEquals(state2.map.get("bar"), new String[] {"bar"}); } + + @Data + public static class OuterClass { + private Map<String, InnerClass> f1 = new HashMap<>(); + private TestEnum f2; + } + + @Data + public static class InnerClass { + int f1; + } + + @Test(dataProvider = "compatible") + public void testNestedMapGenericCodegen(boolean compatible) { + Fory fory = + builder() + .withCodegen(true) + .withCompatibleMode( + compatible ? CompatibleMode.COMPATIBLE : CompatibleMode.SCHEMA_CONSISTENT) + .requireClassRegistration(false) + .build(); + + OuterClass value = new OuterClass(); + value.f1.put("aaa", null); + serDeCheck(fory, value); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
