From 128b2035252b79259c48f6521afcb0c99192498e Mon Sep 17 00:00:00 2001 From: oris garno Date: Tue, 21 Jan 2025 23:18:16 +0700 Subject: [PATCH] fix(java): try replace classdef inplace --- .../java/org/apache/fury/meta/ClassDef.java | 28 ++++++++++++------- .../org/apache/fury/meta/ClassDefEncoder.java | 6 +++- .../java/org/apache/fury/meta/ClassSpec.java | 2 +- .../org/apache/fury/resolver/ClassInfo.java | 2 +- .../apache/fury/resolver/ClassResolver.java | 8 ++++-- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/java/fury-core/src/main/java/org/apache/fury/meta/ClassDef.java b/java/fury-core/src/main/java/org/apache/fury/meta/ClassDef.java index 9426dc3121..d1d7e87b90 100644 --- a/java/fury-core/src/main/java/org/apache/fury/meta/ClassDef.java +++ b/java/fury-core/src/main/java/org/apache/fury/meta/ClassDef.java @@ -48,6 +48,7 @@ import org.apache.fury.memory.Platform; import org.apache.fury.reflect.ReflectionUtils; import org.apache.fury.reflect.TypeRef; +import org.apache.fury.resolver.ClassInfo; import org.apache.fury.resolver.ClassResolver; import org.apache.fury.serializer.CompatibleSerializer; import org.apache.fury.serializer.NonexistentClass; @@ -105,13 +106,13 @@ public class ClassDef implements Serializable { } }; - private final ClassSpec classSpec; - private final List fieldsInfo; - private final boolean isObjectType; + private ClassSpec classSpec; + private List fieldsInfo; + private boolean isObjectType; // Unique id for class def. If class def are same between processes, then the id will // be same too. - private final long id; - private final byte[] encoded; + private long id; + private byte[] encoded; private transient List descriptors; ClassDef( @@ -788,9 +789,16 @@ public static ClassDef buildClassDef( return ClassDefEncoder.buildClassDef(classResolver, type, fields, isObjectType); } -// public ClassDef replaceRootClassTo( -// Class targetCls -// ) { -// this.classSpec.entireClassName = targetCls.getName(); -// } + public void replaceRootClassTo( + ClassResolver classResolver, + ClassInfo targetCls + ) { + ClassDef classDef = ClassDefEncoder.buildClassDefWithFieldInfos(classResolver, targetCls.getCls(), targetCls.classDef.getFieldsInfo(), true); + this.fieldsInfo = classDef.fieldsInfo; + this.classSpec = classDef.classSpec; + this.id = classDef.id; + this.encoded = classDef.encoded; + this.descriptors = classDef.descriptors; + this.isObjectType = classDef.isObjectType; + } } diff --git a/java/fury-core/src/main/java/org/apache/fury/meta/ClassDefEncoder.java b/java/fury-core/src/main/java/org/apache/fury/meta/ClassDefEncoder.java index c1ac5ebdce..21fb2fba54 100644 --- a/java/fury-core/src/main/java/org/apache/fury/meta/ClassDefEncoder.java +++ b/java/fury-core/src/main/java/org/apache/fury/meta/ClassDefEncoder.java @@ -105,7 +105,11 @@ static List buildFieldsInfo(ClassResolver resolver, List field /** Build class definition from fields of class. */ static ClassDef buildClassDef( ClassResolver classResolver, Class type, List fields, boolean isObjectType) { - List fieldInfos = buildFieldsInfo(classResolver, fields); + return buildClassDefWithFieldInfos(classResolver, type, buildFieldsInfo(classResolver, fields), isObjectType); + } + + static ClassDef buildClassDefWithFieldInfos( + ClassResolver classResolver, Class type, List fieldInfos, boolean isObjectType) { Map> classLayers = getClassFields(type, fieldInfos); fieldInfos = new ArrayList<>(fieldInfos.size()); classLayers.values().forEach(fieldInfos::addAll); diff --git a/java/fury-core/src/main/java/org/apache/fury/meta/ClassSpec.java b/java/fury-core/src/main/java/org/apache/fury/meta/ClassSpec.java index d32eca8bbf..774ea72e04 100644 --- a/java/fury-core/src/main/java/org/apache/fury/meta/ClassSpec.java +++ b/java/fury-core/src/main/java/org/apache/fury/meta/ClassSpec.java @@ -22,7 +22,7 @@ import org.apache.fury.type.TypeUtils; public class ClassSpec { - public final String entireClassName; + public String entireClassName; /** Whether current class is enum of component is enum if current class is array. */ public final boolean isEnum; diff --git a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassInfo.java b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassInfo.java index 3ca0c85587..0881616465 100644 --- a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassInfo.java +++ b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassInfo.java @@ -48,7 +48,7 @@ public class ClassInfo { // use primitive to avoid boxing // class id must be less than Integer.MAX_VALUE/2 since we use bit 0 as class id flag. short classId; - ClassDef classDef; + public ClassDef classDef; boolean needToWriteClassDef; ClassInfo( diff --git a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java index 4db676088e..9f89c83e12 100644 --- a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java +++ b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java @@ -1678,8 +1678,12 @@ public ClassInfo readClassInfo(MemoryBuffer buffer, Class targetClass) { if (metaContextShareEnabled) { ClassInfo classInfo = readClassInfoWithMetaShare(buffer, fury.getSerializationContext().getMetaContext()); ClassInfo targetClassInfo = getClassInfo(targetClass); - Serializer serializer = targetClassInfo.getSerializer(); - classInfo.setSerializer(this, serializer); + + buildClassDef(classInfo); + buildClassDef(targetClassInfo); + + classInfo.classDef.replaceRootClassTo(this, targetClassInfo); + return classInfo; }