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;