This is an automated email from the ASF dual-hosted git repository.
min pushed a commit to branch 2.6.x
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/2.6.x by this push:
new badea86 apply #2220 to 2.6.x branch, issue #2178 (#3519)
badea86 is described below
commit badea862d341f0468c1dea45dbeeed7e06b7c0da
Author: min <[email protected]>
AuthorDate: Thu Feb 21 21:41:58 2019 +0800
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
---
.../support/SerializableClassRegistry.java | 22 +++++++++++++++++-----
.../support/SerializableClassRegistryTest.java | 10 +++++-----
.../dubbo/common/serialize/fst/FstFactory.java | 2 +-
.../common/serialize/kryo/CompatibleKryo.java | 12 +++++++++++-
.../serialize/kryo/utils/AbstractKryoFactory.java | 10 ++++++++--
.../serialize/kryo/utils/ReflectionUtils.java | 4 ++++
.../serialization/AbstractSerializationTest.java | 12 ++++++------
7 files changed, 52 insertions(+), 20 deletions(-)
diff --git
a/dubbo-serialization/dubbo-serialization-api/src/main/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistry.java
b/dubbo-serialization/dubbo-serialization-api/src/main/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistry.java
index 132f27a..467d1be 100644
---
a/dubbo-serialization/dubbo-serialization-api/src/main/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistry.java
+++
b/dubbo-serialization/dubbo-serialization-api/src/main/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistry.java
@@ -16,21 +16,33 @@
*/
package com.alibaba.dubbo.common.serialize.support;
-import java.util.LinkedHashSet;
-import java.util.Set;
+import com.esotericsoftware.kryo.Serializer;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
public abstract class SerializableClassRegistry {
- private static final Set<Class> registrations = new LinkedHashSet<Class>();
+ private static final Map<Class, Object> registrations = new
LinkedHashMap<Class, Object>();
/**
* only supposed to be called at startup time
*/
public static void registerClass(Class clazz) {
- registrations.add(clazz);
+ registerClass(clazz, null);
+ }
+
+ /**
+ * only supposed to be called at startup time
+ */
+ public static void registerClass(Class clazz, Serializer serializer) {
+ if (clazz == null) {
+ throw new IllegalArgumentException("Class registered to kryo
cannot be null!");
+ }
+ registrations.put(clazz, serializer);
}
- public static Set<Class> getRegisteredClasses() {
+ public static Map<Class, Object> getRegisteredClasses() {
return registrations;
}
}
diff --git
a/dubbo-serialization/dubbo-serialization-api/src/test/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistryTest.java
b/dubbo-serialization/dubbo-serialization-api/src/test/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistryTest.java
index 156e52f..35f78cc 100644
---
a/dubbo-serialization/dubbo-serialization-api/src/test/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistryTest.java
+++
b/dubbo-serialization/dubbo-serialization-api/src/test/java/com/alibaba/dubbo/common/serialize/support/SerializableClassRegistryTest.java
@@ -18,9 +18,9 @@ package com.alibaba.dubbo.common.serialize.support;
import org.junit.Test;
-import java.util.Set;
+import java.util.Map;
-import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
public class SerializableClassRegistryTest {
@@ -29,8 +29,8 @@ public class SerializableClassRegistryTest {
SerializableClassRegistry.registerClass(A.class);
SerializableClassRegistry.registerClass(B.class);
- Set<Class> registeredClasses =
SerializableClassRegistry.getRegisteredClasses();
- assertThat(registeredClasses, hasSize(2));
+ Map<Class, Object> registeredClasses =
SerializableClassRegistry.getRegisteredClasses();
+ assertThat(registeredClasses.size(), equalTo(2));
}
private class A {
@@ -38,4 +38,4 @@ public class SerializableClassRegistryTest {
private class B {
}
-}
\ No newline at end of file
+}
diff --git
a/dubbo-serialization/dubbo-serialization-fst/src/main/java/com/alibaba/dubbo/common/serialize/fst/FstFactory.java
b/dubbo-serialization/dubbo-serialization-fst/src/main/java/com/alibaba/dubbo/common/serialize/fst/FstFactory.java
index 028cfd7..4377f88 100644
---
a/dubbo-serialization/dubbo-serialization-fst/src/main/java/com/alibaba/dubbo/common/serialize/fst/FstFactory.java
+++
b/dubbo-serialization/dubbo-serialization-fst/src/main/java/com/alibaba/dubbo/common/serialize/fst/FstFactory.java
@@ -37,7 +37,7 @@ public class FstFactory {
}
public FstFactory() {
- for (Class clazz : SerializableClassRegistry.getRegisteredClasses()) {
+ for (Class clazz :
SerializableClassRegistry.getRegisteredClasses().keySet()) {
conf.registerClass(clazz);
}
}
diff --git
a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/CompatibleKryo.java
b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/CompatibleKryo.java
index 3029060..2b44010 100644
---
a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/CompatibleKryo.java
+++
b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/CompatibleKryo.java
@@ -34,12 +34,22 @@ public class CompatibleKryo extends Kryo {
throw new IllegalArgumentException("type cannot be null.");
}
- if (!type.isArray() && !type.isEnum() &&
!ReflectionUtils.checkZeroArgConstructor(type)) {
+ /**
+ * Kryo requires every class to provide a zero argument constructor.
For any class does not match this condition, kryo have two ways:
+ * 1. Use JavaSerializer,
+ * 2. Set 'kryo.setInstantiatorStrategy(new
DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));',
StdInstantiatorStrategy can generate an instance bypassing the constructor.
+ *
+ * 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
+ * default to the default serializer.
+ * It is the responsibility of kryo to handle with every standard jdk
classes, so we will just escape these classes.
+ */
+ if (!ReflectionUtils.isJdk(type) && !type.isArray() && !type.isEnum()
&& !ReflectionUtils.checkZeroArgConstructor(type)) {
if (logger.isWarnEnabled()) {
logger.warn(type + " has no zero-arg constructor and this will
affect the serialization performance");
}
return new JavaSerializer();
}
+
return super.getDefaultSerializer(type);
}
}
diff --git
a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.java
b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.java
index bcde92a..7ca5c6c 100644
---
a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.java
+++
b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.java
@@ -20,6 +20,7 @@ import com.alibaba.dubbo.common.serialize.kryo.CompatibleKryo;
import com.alibaba.dubbo.common.serialize.support.SerializableClassRegistry;
import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.pool.KryoFactory;
import com.esotericsoftware.kryo.serializers.DefaultSerializers;
import de.javakaffee.kryoserializers.ArraysAsListSerializer;
@@ -48,6 +49,7 @@ import java.util.HashSet;
import java.util.Hashtable;
import java.util.LinkedHashSet;
import java.util.LinkedList;
+import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
@@ -134,8 +136,12 @@ public abstract class AbstractKryoFactory implements
KryoFactory {
kryo.register(clazz);
}
- for (Class clazz : SerializableClassRegistry.getRegisteredClasses()) {
- kryo.register(clazz);
+ for (Map.Entry<Class, Object> entry :
SerializableClassRegistry.getRegisteredClasses().entrySet()) {
+ if (entry.getValue() == null) {
+ kryo.register(entry.getKey());
+ } else {
+ kryo.register(entry.getKey(), (Serializer) entry.getValue());
+ }
}
return kryo;
diff --git
a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/ReflectionUtils.java
b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/ReflectionUtils.java
index b35fcc6..469ec61 100644
---
a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/ReflectionUtils.java
+++
b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/com/alibaba/dubbo/common/serialize/kryo/utils/ReflectionUtils.java
@@ -26,4 +26,8 @@ public abstract class ReflectionUtils {
return false;
}
}
+
+ public static boolean isJdk(Class clazz) {
+ return clazz.getName().startsWith("java.") ||
clazz.getName().startsWith("javax.");
+ }
}
diff --git
a/dubbo-serialization/dubbo-serialization-kryo/src/test/java/com/alibaba/dubbo/common/serialize/serialization/AbstractSerializationTest.java
b/dubbo-serialization/dubbo-serialization-kryo/src/test/java/com/alibaba/dubbo/common/serialize/serialization/AbstractSerializationTest.java
index 61c6425..0a645a9 100644
---
a/dubbo-serialization/dubbo-serialization-kryo/src/test/java/com/alibaba/dubbo/common/serialize/serialization/AbstractSerializationTest.java
+++
b/dubbo-serialization/dubbo-serialization-kryo/src/test/java/com/alibaba/dubbo/common/serialize/serialization/AbstractSerializationTest.java
@@ -67,7 +67,7 @@ public abstract class AbstractSerializationTest {
URL url = new URL("protocol", "1.1.1.1", 1234);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- // ================ Primitive Type ================
+ // ================ Primitive Type ================
BigPerson bigPerson;
MediaContent mediaContent;
@@ -383,7 +383,7 @@ public abstract class AbstractSerializationTest {
}
}
- // ================ Array Type ================
+ // ================ Array Type ================
<T> void assertObjectArray(T[] data, Class<T[]> clazz) throws Exception {
ObjectOutput objectOutput = serialization.serialize(url,
byteArrayOutputStream);
@@ -762,7 +762,7 @@ public abstract class AbstractSerializationTest {
assertObjectArrayWithType(new String[]{"1", "b"}, String[].class);
}
- // ================ Simple Type ================
+ // ================ Simple Type ================
@Test
public void test_IntegerArray() throws Exception {
@@ -979,7 +979,7 @@ public abstract class AbstractSerializationTest {
}
}
- // ================ Complex Collection Type ================
+ // ================ Complex Collection Type ================
@Test
public void test_SPersonList() throws Exception {
@@ -1111,7 +1111,7 @@ public abstract class AbstractSerializationTest {
}
- // abnormal case
+ // abnormal case
@Test
public void test_MediaContent_badStream() throws Exception {
@@ -1207,4 +1207,4 @@ public abstract class AbstractSerializationTest {
} catch (IOException expected) {
}
}
-}
\ No newline at end of file
+}