Skip to content

Commit badea86

Browse files
authored
apply #2220 to 2.6.x branch, issue #2178 (#3519)
* Apply #2925 to branch 2.6.x * apply #2220 to 2.6.x branch, issue #2178 * Revise the naming conventions (#3506) * apply #2220 to 2.6.x branch, issue #2178 * remove java.time package
1 parent 40b0ff2 commit badea86

File tree

7 files changed

+52
-20
lines changed

7 files changed

+52
-20
lines changed

dubbo-serialization/dubbo-serialization-api/src/main/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistry.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,33 @@
1616
*/
1717
package com.alibaba.dubbo.common.serialize.support;
1818

19-
import java.util.LinkedHashSet;
20-
import java.util.Set;
19+
import com.esotericsoftware.kryo.Serializer;
20+
21+
import java.util.LinkedHashMap;
22+
import java.util.Map;
2123

2224
public abstract class SerializableClassRegistry {
2325

24-
private static final Set<Class> registrations = new LinkedHashSet<Class>();
26+
private static final Map<Class, Object> registrations = new LinkedHashMap<Class, Object>();
2527

2628
/**
2729
* only supposed to be called at startup time
2830
*/
2931
public static void registerClass(Class clazz) {
30-
registrations.add(clazz);
32+
registerClass(clazz, null);
33+
}
34+
35+
/**
36+
* only supposed to be called at startup time
37+
*/
38+
public static void registerClass(Class clazz, Serializer serializer) {
39+
if (clazz == null) {
40+
throw new IllegalArgumentException("Class registered to kryo cannot be null!");
41+
}
42+
registrations.put(clazz, serializer);
3143
}
3244

33-
public static Set<Class> getRegisteredClasses() {
45+
public static Map<Class, Object> getRegisteredClasses() {
3446
return registrations;
3547
}
3648
}

dubbo-serialization/dubbo-serialization-api/src/test/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistryTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818

1919
import org.junit.Test;
2020

21-
import java.util.Set;
21+
import java.util.Map;
2222

23-
import static org.hamcrest.Matchers.hasSize;
23+
import static org.hamcrest.Matchers.equalTo;
2424
import static org.junit.Assert.assertThat;
2525

2626
public class SerializableClassRegistryTest {
@@ -29,13 +29,13 @@ public void testAddClasses() {
2929
SerializableClassRegistry.registerClass(A.class);
3030
SerializableClassRegistry.registerClass(B.class);
3131

32-
Set<Class> registeredClasses = SerializableClassRegistry.getRegisteredClasses();
33-
assertThat(registeredClasses, hasSize(2));
32+
Map<Class, Object> registeredClasses = SerializableClassRegistry.getRegisteredClasses();
33+
assertThat(registeredClasses.size(), equalTo(2));
3434
}
3535

3636
private class A {
3737
}
3838

3939
private class B {
4040
}
41-
}
41+
}

dubbo-serialization/dubbo-serialization-fst/src/main/java/com/alibaba/dubbo/common/serialize/fst/FstFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public static FstFactory getDefaultFactory() {
3737
}
3838

3939
public FstFactory() {
40-
for (Class clazz : SerializableClassRegistry.getRegisteredClasses()) {
40+
for (Class clazz : SerializableClassRegistry.getRegisteredClasses().keySet()) {
4141
conf.registerClass(clazz);
4242
}
4343
}

dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/CompatibleKryo.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,22 @@ public Serializer getDefaultSerializer(Class type) {
3434
throw new IllegalArgumentException("type cannot be null.");
3535
}
3636

37-
if (!type.isArray() && !type.isEnum() && !ReflectionUtils.checkZeroArgConstructor(type)) {
37+
/**
38+
* Kryo requires every class to provide a zero argument constructor. For any class does not match this condition, kryo have two ways:
39+
* 1. Use JavaSerializer,
40+
* 2. Set 'kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));', StdInstantiatorStrategy can generate an instance bypassing the constructor.
41+
*
42+
* In practice, it's not possible for Dubbo users to register kryo Serializer for every customized class. So in most cases, customized classes with/without zero argument constructor will
43+
* default to the default serializer.
44+
* It is the responsibility of kryo to handle with every standard jdk classes, so we will just escape these classes.
45+
*/
46+
if (!ReflectionUtils.isJdk(type) && !type.isArray() && !type.isEnum() && !ReflectionUtils.checkZeroArgConstructor(type)) {
3847
if (logger.isWarnEnabled()) {
3948
logger.warn(type + " has no zero-arg constructor and this will affect the serialization performance");
4049
}
4150
return new JavaSerializer();
4251
}
52+
4353
return super.getDefaultSerializer(type);
4454
}
4555
}

dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.alibaba.dubbo.common.serialize.support.SerializableClassRegistry;
2121

2222
import com.esotericsoftware.kryo.Kryo;
23+
import com.esotericsoftware.kryo.Serializer;
2324
import com.esotericsoftware.kryo.pool.KryoFactory;
2425
import com.esotericsoftware.kryo.serializers.DefaultSerializers;
2526
import de.javakaffee.kryoserializers.ArraysAsListSerializer;
@@ -48,6 +49,7 @@
4849
import java.util.Hashtable;
4950
import java.util.LinkedHashSet;
5051
import java.util.LinkedList;
52+
import java.util.Map;
5153
import java.util.Set;
5254
import java.util.TreeSet;
5355
import java.util.UUID;
@@ -134,8 +136,12 @@ public Kryo create() {
134136
kryo.register(clazz);
135137
}
136138

137-
for (Class clazz : SerializableClassRegistry.getRegisteredClasses()) {
138-
kryo.register(clazz);
139+
for (Map.Entry<Class, Object> entry : SerializableClassRegistry.getRegisteredClasses().entrySet()) {
140+
if (entry.getValue() == null) {
141+
kryo.register(entry.getKey());
142+
} else {
143+
kryo.register(entry.getKey(), (Serializer) entry.getValue());
144+
}
139145
}
140146

141147
return kryo;

dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/ReflectionUtils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ public static boolean checkZeroArgConstructor(Class clazz) {
2626
return false;
2727
}
2828
}
29+
30+
public static boolean isJdk(Class clazz) {
31+
return clazz.getName().startsWith("java.") || clazz.getName().startsWith("javax.");
32+
}
2933
}

dubbo-serialization/dubbo-serialization-kryo/src/test/java/com/alibaba/dubbo/common/serialize/serialization/AbstractSerializationTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public abstract class AbstractSerializationTest {
6767
URL url = new URL("protocol", "1.1.1.1", 1234);
6868
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
6969

70-
// ================ Primitive Type ================
70+
// ================ Primitive Type ================
7171
BigPerson bigPerson;
7272
MediaContent mediaContent;
7373

@@ -383,7 +383,7 @@ public void test_BytesRange() throws Exception {
383383
}
384384
}
385385

386-
// ================ Array Type ================
386+
// ================ Array Type ================
387387

388388
<T> void assertObjectArray(T[] data, Class<T[]> clazz) throws Exception {
389389
ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream);
@@ -762,7 +762,7 @@ public void test_StringArray_withType() throws Exception {
762762
assertObjectArrayWithType(new String[]{"1", "b"}, String[].class);
763763
}
764764

765-
// ================ Simple Type ================
765+
// ================ Simple Type ================
766766

767767
@Test
768768
public void test_IntegerArray() throws Exception {
@@ -979,7 +979,7 @@ public void test_LinkedHashMap() throws Exception {
979979
}
980980
}
981981

982-
// ================ Complex Collection Type ================
982+
// ================ Complex Collection Type ================
983983

984984
@Test
985985
public void test_SPersonList() throws Exception {
@@ -1111,7 +1111,7 @@ public void test_MultiObject_WithType() throws Exception {
11111111
}
11121112

11131113

1114-
// abnormal case
1114+
// abnormal case
11151115

11161116
@Test
11171117
public void test_MediaContent_badStream() throws Exception {
@@ -1207,4 +1207,4 @@ public void test_URL_mutable_withType() throws Exception {
12071207
} catch (IOException expected) {
12081208
}
12091209
}
1210-
}
1210+
}

0 commit comments

Comments
 (0)