Skip to content

Commit

Permalink
feat(java): deserialize one pojo into another type
Browse files Browse the repository at this point in the history
  • Loading branch information
orisgarno committed Jan 19, 2025
1 parent 87ddcc8 commit a899245
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 5 deletions.
2 changes: 1 addition & 1 deletion java/fury-core/src/main/java/org/apache/fury/Fury.java
Original file line number Diff line number Diff line change
Expand Up @@ -1122,7 +1122,7 @@ public <T> T deserializeJavaObject(MemoryBuffer buffer, Class<T> 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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -787,4 +787,10 @@ public static ClassDef buildClassDef(
ClassResolver classResolver, Class<?> type, List<Field> fields, boolean isObjectType) {
return ClassDefEncoder.buildClassDef(classResolver, type, fields, isObjectType);
}

// public ClassDef replaceRootClassTo(
// Class<?> targetCls
// ) {
// this.classSpec.entireClassName = targetCls.getName();
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Object> 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 <code>buffer</code>. `classInfoCache` is used as a cache to
* reduce map lookup to load class from binary.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ void testTargetHasLessFieldComparedToSourceClass() throws InterruptedException {
ClassCompleteField<String> subclass = new ClassCompleteField<>("subclass", "subclass2");
ClassCompleteField<ClassCompleteField<String>> classCompleteField =
new ClassCompleteField<>(subclass, subclass);
byte[] serialized = getFury(ClassCompleteField.class).serializeJavaObject(classCompleteField);
byte[] serialized = getFury().serializeJavaObject(classCompleteField);
ClassMissingField<ClassMissingField<String>> classMissingField =
getFury(ClassMissingField.class).deserializeJavaObject(serialized, ClassMissingField.class);
getFury().deserializeJavaObject(serialized, ClassMissingField.class);

assertEq(classCompleteField, classMissingField);
}
Expand All @@ -73,10 +73,10 @@ void testTargetHasMoreFieldComparedToSourceClass() throws InterruptedException {

ClassMissingField<String> 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);
Expand Down

0 comments on commit a899245

Please sign in to comment.