Skip to content

Commit

Permalink
[Java] fix jit error for register private serializers (#999)
Browse files Browse the repository at this point in the history
fix jit error for register private serializers
  • Loading branch information
chaokunyang authored Oct 10, 2023
1 parent 46c363c commit 34759aa
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -481,18 +481,25 @@ protected Expression getOrCreateSerializer(Class<?> cls) {
beanClass.getClassLoader() == null
? Thread.currentThread().getContextClassLoader()
: beanClass.getClassLoader();
try {
beanClassClassLoader.loadClass(serializerClass.getName());
} catch (ClassNotFoundException e) {
// If `cls` is loaded in another class different from `beanClassClassLoader`,
// then serializerClass is loaded in another class different from `beanClassClassLoader`.
serializerClass = LazyInitBeanSerializer.class;
}
if (serializerClass == LazyInitBeanSerializer.class
|| serializerClass == ObjectSerializer.class
|| serializerClass == CompatibleSerializer.class) {
// field init may get jit serializer, which will cause cast exception if not use base type.
if (!ReflectionUtils.isPublic(serializerClass)) {
// TODO(chaokunyang) add jdk17+ unexported class check.
// non-public class can't be accessed in generated class.
serializerClass = Serializer.class;
} else {
try {
beanClassClassLoader.loadClass(serializerClass.getName());
} catch (ClassNotFoundException e) {
// If `cls` is loaded in another class different from `beanClassClassLoader`,
// then serializerClass is loaded in another class different from `beanClassClassLoader`.
serializerClass = LazyInitBeanSerializer.class;
}
if (serializerClass == LazyInitBeanSerializer.class
|| serializerClass == ObjectSerializer.class
|| serializerClass == CompatibleSerializer.class) {
// field init may get jit serializer, which will cause cast exception if not use base
// type.
serializerClass = Serializer.class;
}
}
TypeToken<? extends Serializer> serializerTypeToken = TypeToken.of(serializerClass);
Expression fieldTypeExpr = getClassExpr(cls);
Expand Down
32 changes: 32 additions & 0 deletions java/fury-core/src/test/java/io/fury/FuryTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.UUID;
import java.util.WeakHashMap;
import lombok.AllArgsConstructor;
import lombok.Data;
Expand Down Expand Up @@ -535,4 +536,35 @@ public void testJavaOutputStream() throws IOException {
assertEquals(newObj, beanA);
}
}

@Data
static class DomainObject {
UUID id;
}

static class UUIDSerializer extends Serializer<UUID> {
public UUIDSerializer(Fury fury) {
super(fury, UUID.class);
}

@Override
public UUID read(MemoryBuffer buffer) {
return new UUID(buffer.readLong(), buffer.readLong());
}

@Override
public void write(MemoryBuffer buffer, UUID value) {
buffer.writeLong(value.getMostSignificantBits());
buffer.writeLong(value.getLeastSignificantBits());
}
}

@Test
public void testRegisterPrivateSerializer() {
Fury fury = Fury.builder().withRefTracking(true).requireClassRegistration(false).build();
fury.registerSerializer(UUID.class, new UUIDSerializer(fury));
DomainObject obj = new DomainObject();
obj.id = UUID.randomUUID();
serDeCheckSerializer(fury, obj, "Codec");
}
}

0 comments on commit 34759aa

Please sign in to comment.