Skip to content

Commit 5fc75a2

Browse files
authored
fix: hessian deserialize support sofa.serialize.dynamic.load.enable (#1463)
1 parent be93251 commit 5fc75a2

File tree

2 files changed

+59
-5
lines changed

2 files changed

+59
-5
lines changed

codec/codec-sofa-hessian/src/main/java/com/alipay/sofa/rpc/codec/sofahessian/SingleClassLoaderSofaSerializerFactory.java

+24-5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
import com.caucho.hessian.io.Serializer;
2828
import com.caucho.hessian.io.SerializerFactory;
2929

30+
import java.util.Map;
31+
import java.util.concurrent.ConcurrentHashMap;
32+
3033
import static com.alipay.hessian.generic.io.GenericDeserializer.ARRAY_PREFIX;
3134
import static com.alipay.sofa.rpc.codec.sofahessian.serialize.GenericCustomThrowableDeterminer.isGenericThrowException;
3235

@@ -40,8 +43,14 @@ public class SingleClassLoaderSofaSerializerFactory extends SerializerFactory {
4043
/**
4144
* logger for this class
4245
*/
43-
private static final Logger LOGGER = LoggerFactory
44-
.getLogger(SingleClassLoaderSofaSerializerFactory.class);
46+
private static final Logger LOGGER = LoggerFactory
47+
.getLogger(SingleClassLoaderSofaSerializerFactory.class);
48+
49+
private final Map<ClassLoader, Map<String, Object>> _typeNotFoundMap = new ConcurrentHashMap<>(8);
50+
private static final Object NOT_FOUND = new Object();
51+
private final boolean dynamicLoadEnable = Boolean.parseBoolean(System.getProperty(
52+
DYNAMIC_LOAD_ENABLE_KEY,
53+
Boolean.FALSE.toString()));
4554

4655
@Override
4756
protected Serializer getDefaultSerializer(Class cl) {
@@ -73,14 +82,24 @@ public Deserializer getDeserializer(String type) throws HessianProtocolException
7382
Deserializer subDeserializer = getDeserializer(type.substring(1));
7483
deserializer = new ArrayDeserializer(subDeserializer);
7584
} else {
85+
ClassLoader appClassLoader = Thread.currentThread().getContextClassLoader();
7686
try {
77-
ClassLoader appClassLoader = Thread.currentThread().getContextClassLoader();
87+
if (!dynamicLoadEnable) {
88+
Map<String, Object> typeMap = _typeNotFoundMap.get(appClassLoader);
89+
if (typeMap != null) {
90+
if (typeMap.containsKey(type)) {
91+
return null;
92+
}
93+
}
94+
}
7895
Class<?> cl = Class.forName(type, true, appClassLoader);
7996
deserializer = getDeserializer(cl);
8097
} catch (Exception e) {
8198
if (e instanceof ClassNotFoundException) {
82-
LOGGER.errorWithApp(null, LogCodes.getLog(LogCodes.ERROR_DECODE_CLASS_NOT_FOUND,
83-
getClass().getName(), type, Thread.currentThread().getContextClassLoader()));
99+
if (!dynamicLoadEnable) {
100+
_typeNotFoundMap.computeIfAbsent(appClassLoader, k -> new ConcurrentHashMap<>(8)).put(type, NOT_FOUND);
101+
}
102+
LOGGER.errorWithApp(null, LogCodes.getLog(LogCodes.ERROR_DECODE_CLASS_NOT_FOUND, getClass().getName(), type, appClassLoader));
84103
} else {
85104
LOGGER.errorWithApp(null, e.toString(), e);
86105
}

codec/codec-sofa-hessian/src/test/java/com/alipay/sofa/rpc/codec/sofahessian/SingleClassLoaderSofaSerializerFactoryTest.java

+35
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@
1616
*/
1717
package com.alipay.sofa.rpc.codec.sofahessian;
1818

19+
import com.caucho.hessian.io.Deserializer;
1920
import com.caucho.hessian.io.Hessian2Input;
2021
import com.caucho.hessian.io.Hessian2Output;
22+
import com.caucho.hessian.io.SerializerFactory;
23+
import org.junit.Assert;
2124
import org.junit.Test;
2225

2326
import java.io.ByteArrayInputStream;
2427
import java.io.ByteArrayOutputStream;
2528
import java.io.IOException;
29+
import java.lang.reflect.Field;
2630
import java.util.HashMap;
2731
import java.util.Map;
2832

@@ -63,4 +67,35 @@ public void testAll() throws IOException {
6367
assertEquals(a1[i], a2[i]);
6468
}
6569

70+
@Test
71+
public void testDynamicLoadDisabled() throws Exception {
72+
SingleClassLoaderSofaSerializerFactory factory = new SingleClassLoaderSofaSerializerFactory();
73+
Field field = SingleClassLoaderSofaSerializerFactory.class.getDeclaredField("_typeNotFoundMap");
74+
field.setAccessible(true);
75+
Map<ClassLoader, Map<String, Object>> _typeNotFoundMap = (Map<ClassLoader, Map<String, Object>>) field
76+
.get(factory);
77+
Assert.assertEquals(0, _typeNotFoundMap.size());
78+
Deserializer deserializer = factory.getDeserializer("mock.xxx.MockObject");
79+
Assert.assertNull(deserializer);
80+
Assert.assertEquals(1, _typeNotFoundMap.size());
81+
}
82+
83+
@Test
84+
public void testDynamicLoadEnabled() throws Exception {
85+
try {
86+
System.setProperty(SerializerFactory.DYNAMIC_LOAD_ENABLE_KEY, "true");
87+
SingleClassLoaderSofaSerializerFactory factory = new SingleClassLoaderSofaSerializerFactory();
88+
Field field = SingleClassLoaderSofaSerializerFactory.class.getDeclaredField("_typeNotFoundMap");
89+
field.setAccessible(true);
90+
Map<ClassLoader, Map<String, Object>> _typeNotFoundMap = (Map<ClassLoader, Map<String, Object>>) field
91+
.get(factory);
92+
Assert.assertEquals(0, _typeNotFoundMap.size());
93+
Deserializer deserializer = factory.getDeserializer("mock.xxx.MockObject");
94+
Assert.assertNull(deserializer);
95+
Assert.assertEquals(0, _typeNotFoundMap.size());
96+
} finally {
97+
System.clearProperty(SerializerFactory.DYNAMIC_LOAD_ENABLE_KEY);
98+
}
99+
}
100+
66101
}

0 commit comments

Comments
 (0)