diff --git a/java/fury-core/src/main/java/org/apache/fury/Fury.java b/java/fury-core/src/main/java/org/apache/fury/Fury.java index 7b364042df..3de1ea6450 100644 --- a/java/fury-core/src/main/java/org/apache/fury/Fury.java +++ b/java/fury-core/src/main/java/org/apache/fury/Fury.java @@ -1122,7 +1122,7 @@ public T deserializeJavaObject(MemoryBuffer buffer, Class cls) { if (nextReadRefId >= NOT_NULL_VALUE_FLAG) { ClassInfo classInfo; if (shareMeta) { - classInfo = classResolver.readClassInfo(buffer); + classInfo = classResolver.readClassInfo(buffer, cls); } else { classInfo = classResolver.getClassInfo(cls); } 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 1b6177e004..9426dc3121 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 @@ -787,4 +787,10 @@ public static ClassDef buildClassDef( ClassResolver classResolver, Class type, List fields, boolean isObjectType) { return ClassDefEncoder.buildClassDef(classResolver, type, fields, isObjectType); } + +// public ClassDef replaceRootClassTo( +// Class targetCls +// ) { +// this.classSpec.entireClassName = targetCls.getName(); +// } } 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 9b73734e0b..4db676088e 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 @@ -1674,6 +1674,27 @@ public ClassInfo readClassInfo(MemoryBuffer buffer) { return classInfo; } + 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); + return classInfo; + } + + int header = buffer.readVarUint32Small14(); + ClassInfo classInfo; + if ((header & 0b1) != 0) { + classInfo = readClassInfoFromBytes(buffer, classInfoCache, header); + classInfoCache = classInfo; + } else { + classInfo = getOrUpdateClassInfo((short) (header >> 1)); + } + currentReadClass = classInfo.cls; + return classInfo; + } + /** * Read class info from java data buffer. `classInfoCache` is used as a cache to * reduce map lookup to load class from binary. diff --git a/java/fury-core/src/test/java/org/apache/fury/serializer/compatible/DifferentPOJOCompatibleSerializerTest.java b/java/fury-core/src/test/java/org/apache/fury/serializer/compatible/DifferentPOJOCompatibleSerializerTest.java index 3a7436d9c2..65a3877835 100644 --- a/java/fury-core/src/test/java/org/apache/fury/serializer/compatible/DifferentPOJOCompatibleSerializerTest.java +++ b/java/fury-core/src/test/java/org/apache/fury/serializer/compatible/DifferentPOJOCompatibleSerializerTest.java @@ -61,9 +61,9 @@ void testTargetHasLessFieldComparedToSourceClass() throws InterruptedException { ClassCompleteField subclass = new ClassCompleteField<>("subclass", "subclass2"); ClassCompleteField> classCompleteField = new ClassCompleteField<>(subclass, subclass); - byte[] serialized = getFury(ClassCompleteField.class).serializeJavaObject(classCompleteField); + byte[] serialized = getFury().serializeJavaObject(classCompleteField); ClassMissingField> classMissingField = - getFury(ClassMissingField.class).deserializeJavaObject(serialized, ClassMissingField.class); + getFury().deserializeJavaObject(serialized, ClassMissingField.class); assertEq(classCompleteField, classMissingField); } @@ -73,10 +73,10 @@ void testTargetHasMoreFieldComparedToSourceClass() throws InterruptedException { ClassMissingField subclass = new ClassMissingField<>("subclass"); ClassMissingField classMissingField = new ClassMissingField(subclass); - byte[] serialized = getFury(ClassMissingField.class).serializeJavaObject(classMissingField); + byte[] serialized = getFury().serializeJavaObject(classMissingField); ClassCompleteField classCompleteField = - getFury(ClassCompleteField.class) + getFury() .deserializeJavaObject(serialized, ClassCompleteField.class); assertEq(classCompleteField, classMissingField);