Skip to content

Commit 490b724

Browse files
authored
[Java][2/N] support type forward/backward compatibility (#195)
* support Compatible Serialization * add doc
1 parent b3a5d49 commit 490b724

8 files changed

Lines changed: 1152 additions & 2 deletions

File tree

java/fury-core/src/main/java/io/fury/Config.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
package io.fury;
3838

39+
import io.fury.serializer.CompatibleMode;
3940
import io.fury.serializer.Serializer;
4041
import io.fury.serializer.TimeSerializers;
4142
import io.fury.util.MurmurHash3;
@@ -58,6 +59,7 @@ public class Config implements Serializable {
5859
private final boolean compressNumber;
5960
private final boolean compressString;
6061
private final boolean checkClassVersion;
62+
private final CompatibleMode compatibleMode;
6163
private final Class<? extends Serializer> defaultJDKStreamSerializerType;
6264
private final boolean secureModeEnabled;
6365
private final boolean classRegistrationRequired;
@@ -73,6 +75,7 @@ public class Config implements Serializable {
7375
compressNumber = builder.compressNumber;
7476
compressString = builder.compressString;
7577
checkClassVersion = builder.checkClassVersion;
78+
compatibleMode = builder.compatibleMode;
7679
defaultJDKStreamSerializerType = builder.defaultJDKStreamSerializerType;
7780
secureModeEnabled = builder.secureModeEnabled;
7881
classRegistrationRequired = builder.requireClassRegistration;
@@ -125,6 +128,10 @@ public boolean checkClassVersion() {
125128
return checkClassVersion;
126129
}
127130

131+
public CompatibleMode getCompatibleMode() {
132+
return compatibleMode;
133+
}
134+
128135
/**
129136
* Returns default serializer type for class which implements jdk serialization method such as
130137
* `writeObject/readObject`.

java/fury-core/src/main/java/io/fury/Fury.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.fury.serializer.ArraySerializers;
3333
import io.fury.serializer.BufferCallback;
3434
import io.fury.serializer.BufferObject;
35+
import io.fury.serializer.CompatibleMode;
3536
import io.fury.serializer.JavaSerializer;
3637
import io.fury.serializer.OpaqueObjects;
3738
import io.fury.serializer.Serializer;
@@ -1035,6 +1036,7 @@ public static final class FuryBuilder {
10351036
ClassLoader classLoader;
10361037
boolean compressNumber = false;
10371038
boolean compressString = true;
1039+
CompatibleMode compatibleMode = CompatibleMode.SCHEMA_CONSISTENT;
10381040
// TODO(chaokunyang) switch to object stream serializer.
10391041
Class<? extends Serializer> defaultJDKStreamSerializerType = JavaSerializer.class;
10401042
boolean secureModeEnabled = true;
@@ -1079,6 +1081,11 @@ public FuryBuilder withClassLoader(ClassLoader classLoader) {
10791081
return this;
10801082
}
10811083

1084+
public FuryBuilder withCompatibleMode(CompatibleMode compatibleMode) {
1085+
this.compatibleMode = compatibleMode;
1086+
return this;
1087+
}
1088+
10821089
public FuryBuilder requireClassRegistration(boolean requireClassRegistration) {
10831090
this.requireClassRegistration = requireClassRegistration;
10841091
return this;

java/fury-core/src/main/java/io/fury/resolver/ClassResolver.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import io.fury.serializer.ArraySerializers;
3636
import io.fury.serializer.BufferSerializers;
3737
import io.fury.serializer.CollectionSerializers;
38+
import io.fury.serializer.CompatibleSerializer;
3839
import io.fury.serializer.ExternalizableSerializer;
3940
import io.fury.serializer.JavaSerializer;
4041
import io.fury.serializer.JdkProxySerializer;
@@ -636,12 +637,24 @@ public Class<? extends Serializer> getSerializerClass(Class<?> cls) {
636637
if (requireJavaSerialization(cls)) {
637638
return getJavaSerializer(cls);
638639
}
639-
return ObjectSerializer.class;
640+
return getObjectSerializerClass(cls);
640641
}
641642
}
642643

643644
public Class<? extends Serializer> getObjectSerializerClass(Class<?> cls) {
644-
return ObjectSerializer.class;
645+
if (fury.getLanguage() != Language.JAVA) {
646+
LOG.warn("Class {} isn't supported for cross-language serialization.", cls);
647+
}
648+
LOG.debug("Object of type {} can't be serialized by jit", cls);
649+
switch (fury.getConfig().getCompatibleMode()) {
650+
case SCHEMA_CONSISTENT:
651+
return ObjectSerializer.class;
652+
case COMPATIBLE:
653+
return CompatibleSerializer.class;
654+
default:
655+
throw new UnsupportedOperationException(
656+
String.format("Unsupported mode %s", fury.getConfig().getCompatibleMode()));
657+
}
645658
}
646659

647660
public Class<? extends Serializer> getJavaSerializer(Class<?> clz) {

java/fury-core/src/main/java/io/fury/resolver/FieldResolver.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
* info is less than current field, then it will be a field not exists in current class and can be
101101
* skipped.
102102
*
103+
* @see io.fury.serializer.CompatibleSerializerBase
103104
* @author chaokunyang
104105
*/
105106
@SuppressWarnings({"rawtypes", "UnstableApiUsage"})

0 commit comments

Comments
 (0)