Fix hessian2 serialized short, byte is converted to int bug(#19)
diff --git a/src/main/java/com/alibaba/com/caucho/hessian/io/JavaDeserializer.java b/src/main/java/com/alibaba/com/caucho/hessian/io/JavaDeserializer.java
index 229f685..974d7ba 100644
--- a/src/main/java/com/alibaba/com/caucho/hessian/io/JavaDeserializer.java
+++ b/src/main/java/com/alibaba/com/caucho/hessian/io/JavaDeserializer.java
@@ -59,6 +59,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.logging.Logger;
/**
@@ -374,7 +375,11 @@
} else if (List.class.equals(type)
&& field.getGenericType() != field.getType()) {
deser = new ObjectListFieldDeserializer(field);
- } else {
+ } else if (Set.class.equals(type)
+ && field.getGenericType() != field.getType()) {
+ deser = new ObjectSetFieldDeserializer(field);
+ }
+ else {
deser = new ObjectFieldDeserializer(field);
}
@@ -531,6 +536,33 @@
}
}
+ static class ObjectSetFieldDeserializer extends FieldDeserializer {
+ private final Field _field;
+
+ ObjectSetFieldDeserializer(Field field) {
+ _field = field;
+ }
+
+ @Override
+ void deserialize(AbstractHessianInput in, Object obj)
+ throws IOException {
+ Object value = null;
+
+ try {
+
+ Type[] types = ((ParameterizedType) _field.getGenericType()).getActualTypeArguments();
+ value = in.readObject(_field.getType(),
+ isPrimitive(types[0]) ? (Class<?>) types[0] : null
+ );
+
+ _field.set(obj, value);
+ } catch (Exception e) {
+ logDeserializeError(_field, obj, value, e);
+ }
+ }
+ }
+
+
static class IntFieldDeserializer extends FieldDeserializer {
private final Field _field;
diff --git a/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java b/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
index 0b92f47..d59ef71 100644
--- a/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
+++ b/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
@@ -24,11 +24,7 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertTrue;
@@ -207,4 +203,20 @@
assertEquals(Short.valueOf((short)0), deserialize.get(0));
assertEquals(Short.valueOf((short)60), deserialize.get(1));
}
+
+ @Test
+ public void serialize_short_set_then_deserialize() throws Exception {
+
+ Hessian2StringShortType stringShort = new Hessian2StringShortType();
+ Set<Short> shortSet = new HashSet<Short>();
+ shortSet.add((short) 0);
+ shortSet.add((short) 60);
+ stringShort.shortSet = shortSet;
+
+ Hessian2StringShortType deserialize = baseHessian2Serialize(stringShort);
+ assertTrue(deserialize.shortSet != null);
+ assertTrue(deserialize.shortSet.size() == 2);
+ assertTrue(deserialize.shortSet.contains((short) 0));
+ assertTrue(deserialize.shortSet.contains((short) 60));
+ }
}
diff --git a/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Hessian2StringShortType.java b/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Hessian2StringShortType.java
index 4bc77c9..fd0df68 100644
--- a/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Hessian2StringShortType.java
+++ b/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Hessian2StringShortType.java
@@ -18,12 +18,15 @@
import java.io.Serializable;
import java.util.Map;
+import java.util.Set;
/**
* test short serialize & deserialize model
*/
public class Hessian2StringShortType implements Serializable {
+ public Set<Short> shortSet;
+
public Map<String, Short> stringShortMap;
public Map<String, Byte> stringByteMap;