Merge remote-tracking branch 'origin/3.2.5'

# Conflicts:
#	README.md
#	pom.xml
diff --git a/.travis.yml b/.travis.yml
index 4d36f7e..1790f51 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,14 +2,14 @@
 sudo: false # faster builds
 
 jdk:
-    - oraclejdk11
+    - openjdk11
     - openjdk10
-    - oraclejdk9
-    - oraclejdk8
-    - openjdk7
+    - openjdk9
+    - openjdk8
+   #   - openjdk7
 
 script:
     - mvn clean package
 
 after_success:
-    - bash <(curl -s https://codecov.io/bash)
\ No newline at end of file
+    - bash <(curl -s https://codecov.io/bash)
diff --git a/README.md b/README.md
index 73a370f..fe8a126 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,17 @@
-## Hessian Lite(Alibaba embed version)
+## Hessian Lite(Apache Dubbo private version)
 
-[![Build Status](https://travis-ci.org/dubbo/hessian-lite.svg?branch=master)](https://travis-ci.org/dubbo/hessian-lite)
-[![codecov](https://codecov.io/gh/dubbo/hessian-lite/branch/master/graph/badge.svg)](https://codecov.io/gh/dubbo/hessian-lite)
+[![Build Status](https://travis-ci.org/apache/dubbo-hessian-lite.svg?branch=master)](https://travis-ci.org/apache/dubbo-hessian-lite)
+[![codecov](https://codecov.io/gh/apache/dubbo-hessian-lite/branch/master/graph/badge.svg)](https://codecov.io/gh/apache/dubbo-hessian-lite)
 [![Gitter](https://badges.gitter.im/alibaba/dubbo.svg)](https://gitter.im/alibaba/dubbo?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
 ![license](https://img.shields.io/github/license/alibaba/dubbo.svg)
 ![maven](https://img.shields.io/maven-central/v/com.alibaba/hessian-lite.svg)
 
-Hessian-lite is a Alibaba dubbo embed version of [official hessian](https://github.com/ebourg/hessian) initially.  Then this module is separated from Dubbo. All branches of [Dubbo](https://github.com/apache/incubator-dubbo) : 2.5.x, 2.6.x(since 2.6.3) and 2.7.x  are dependent on it , please see the details:
+Hessian-lite is a Alibaba dubbo embed version of [official hessian](https://github.com/ebourg/hessian) initially.  Then this module is separated from Dubbo. All branches of [Dubbo](https://github.com/apache/dubbo) : 2.5.x, 2.6.x(since 2.6.3) and 2.7.x  are dependent on it , please see the details:
 
-- [2018-07-13 Delete the code of dubbo/hessian-lite module of the 2.6.x and 2.5.x branches](https://lists.apache.org/thread.html/72f7bbca340e96fb7da6a7ada014312953cfccd19271fad8e60cbf39@%3Cdev.dubbo.apache.org%3E)
-- [2018-06-04 Moving hessian-lite from Dubbo codebase to eco-system](https://lists.apache.org/thread.html/872bbcada2db0f04145f853dd7c7f8abef589807b8089a5016478ec8@%3Cdev.dubbo.apache.org%3E)
+- [2018-07-13 Delete the code of apache/dubbo-hessian-lite module of the 2.6.x and 2.5.x branches](https://lists.apache.org/thread.html/72f7bbca340e96fb7da6a7ada014312953cfccd19271fad8e60cbf39@%3Cdev.dubbo.apache.org%3E) 
+- [2018-06-04 Moving hessian-lite from Dubbo codebase to eco-system](https://lists.apache.org/thread.html/872bbcada2db0f04145f853dd7c7f8abef589807b8089a5016478ec8@%3Cdev.dubbo.apache.org%3E) 
+
+Now we are trying to build a hessian group https://github.com/hessian-group to make maintainers of Hessian community work more closely together .
 
 ## Maven dependency
 
@@ -17,7 +19,7 @@
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>hessian-lite</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6</version>
 <dependency>
 ```
 
diff --git a/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianInput.java b/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianInput.java
index 1d63fec..db0e574 100644
--- a/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianInput.java
+++ b/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianInput.java
@@ -100,6 +100,8 @@
     public void setSerializerFactory(SerializerFactory ser) {
     }
 
+    public abstract boolean checkAndReadNull();
+
     /**
      * Reads the call
      * <p>
diff --git a/src/main/java/com/alibaba/com/caucho/hessian/io/BasicDeserializer.java b/src/main/java/com/alibaba/com/caucho/hessian/io/BasicDeserializer.java
index 20c593f..dc631e5 100644
--- a/src/main/java/com/alibaba/com/caucho/hessian/io/BasicDeserializer.java
+++ b/src/main/java/com/alibaba/com/caucho/hessian/io/BasicDeserializer.java
@@ -148,6 +148,9 @@
     @Override
     public Object readObject(AbstractHessianInput in)
             throws IOException {
+        if (in.checkAndReadNull()) {
+            return null;
+        }
         switch (_code) {
             case NULL:
                 // hessian/3490
diff --git a/src/main/java/com/alibaba/com/caucho/hessian/io/BasicSerializer.java b/src/main/java/com/alibaba/com/caucho/hessian/io/BasicSerializer.java
index 6d5aee9..4b9f359 100644
--- a/src/main/java/com/alibaba/com/caucho/hessian/io/BasicSerializer.java
+++ b/src/main/java/com/alibaba/com/caucho/hessian/io/BasicSerializer.java
@@ -106,6 +106,8 @@
                 break;
 
             case FLOAT:
+                out.writeDouble(Double.parseDouble(String.valueOf(((Number) obj).floatValue())));
+                break;
             case DOUBLE:
                 out.writeDouble(((Number) obj).doubleValue());
                 break;
diff --git a/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java b/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java
index 1347aa6..fb23606 100644
--- a/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java
+++ b/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java
@@ -91,8 +91,10 @@
             deserializer = factory.getDeserializer(expectType.getName());
         }
 
-        while (!in.isEnd())
+        while (!in.isEnd()) {
             list.add(deserializer != null ? deserializer.readObject(in) : in.readObject());
+        }
+
 
         in.readEnd();
 
@@ -118,8 +120,10 @@
             deserializer = factory.getDeserializer(expectType.getName());
         }
 
-        for (; length > 0; length--)
+        for (; length > 0; length--) {
             list.add(deserializer != null ? deserializer.readObject(in) : in.readObject());
+        }
+
 
         return list;
     }
diff --git a/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java b/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java
index 8d6d7d7..f241d63 100644
--- a/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java
+++ b/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java
@@ -184,6 +184,19 @@
         return _replyFault;
     }
 
+    @Override
+    public boolean checkAndReadNull() {
+        try {
+            int tag = read();
+            if ('N' == tag) {
+                return true;
+            }
+            _offset--;
+        } catch (IOException ignored) {
+        }
+        return false;
+    }
+
     /**
      * Starts reading the call
      * <p>
@@ -833,7 +846,7 @@
             case 0xbf:
                 return tag - BC_INT_ZERO;
 
-      /* byte int */
+            /* byte int */
             case 0xc0:
             case 0xc1:
             case 0xc2:
@@ -852,7 +865,7 @@
             case 0xcf:
                 return ((tag - BC_INT_BYTE_ZERO) << 8) + read();
 
-      /* short int */
+            /* short int */
             case 0xd0:
             case 0xd1:
             case 0xd2:
@@ -898,7 +911,7 @@
             case 0xef:
                 return tag - BC_LONG_ZERO;
 
-      /* byte long */
+            /* byte long */
             case 0xf0:
             case 0xf1:
             case 0xf2:
@@ -917,7 +930,7 @@
             case 0xff:
                 return ((tag - BC_LONG_BYTE_ZERO) << 8) + read();
 
-      /* short long */
+            /* short long */
             case 0x38:
             case 0x39:
             case 0x3a:
@@ -1052,7 +1065,7 @@
             case 0xbf:
                 return tag - BC_INT_ZERO;
 
-      /* byte int */
+            /* byte int */
             case 0xc0:
             case 0xc1:
             case 0xc2:
@@ -1071,7 +1084,7 @@
             case 0xcf:
                 return ((tag - BC_INT_BYTE_ZERO) << 8) + read();
 
-      /* short int */
+            /* short int */
             case 0xd0:
             case 0xd1:
             case 0xd2:
@@ -1123,7 +1136,7 @@
             case 0xef:
                 return tag - BC_LONG_ZERO;
 
-      /* byte long */
+            /* byte long */
             case 0xf0:
             case 0xf1:
             case 0xf2:
@@ -1142,7 +1155,7 @@
             case 0xff:
                 return ((tag - BC_LONG_BYTE_ZERO) << 8) + read();
 
-      /* short long */
+            /* short long */
             case 0x38:
             case 0x39:
             case 0x3a:
@@ -1280,7 +1293,7 @@
             case 0xbf:
                 return tag - 0x90;
 
-      /* byte int */
+            /* byte int */
             case 0xc0:
             case 0xc1:
             case 0xc2:
@@ -1299,7 +1312,7 @@
             case 0xcf:
                 return ((tag - BC_INT_BYTE_ZERO) << 8) + read();
 
-      /* short int */
+            /* short int */
             case 0xd0:
             case 0xd1:
             case 0xd2:
@@ -1342,7 +1355,7 @@
             case 0xef:
                 return tag - BC_LONG_ZERO;
 
-      /* byte long */
+            /* byte long */
             case 0xf0:
             case 0xf1:
             case 0xf2:
@@ -1361,7 +1374,7 @@
             case 0xff:
                 return ((tag - BC_LONG_BYTE_ZERO) << 8) + read();
 
-      /* short long */
+            /* short long */
             case 0x38:
             case 0x39:
             case 0x3a:
@@ -1437,7 +1450,6 @@
             _chunkLength = 0;
             return -1;
         }
-
         int tag = read();
 
         switch (tag) {
@@ -1658,7 +1670,7 @@
             case 0xbf:
                 return String.valueOf((tag - 0x90));
 
-      /* byte int */
+            /* byte int */
             case 0xc0:
             case 0xc1:
             case 0xc2:
@@ -1677,7 +1689,7 @@
             case 0xcf:
                 return String.valueOf(((tag - BC_INT_BYTE_ZERO) << 8) + read());
 
-      /* short int */
+            /* short int */
             case 0xd0:
             case 0xd1:
             case 0xd2:
@@ -1721,7 +1733,7 @@
             case 0xef:
                 return String.valueOf(tag - BC_LONG_ZERO);
 
-      /* byte long */
+            /* byte long */
             case 0xf0:
             case 0xf1:
             case 0xf2:
@@ -1740,7 +1752,7 @@
             case 0xff:
                 return String.valueOf(((tag - BC_LONG_BYTE_ZERO) << 8) + read());
 
-      /* short long */
+            /* short long */
             case 0x38:
             case 0x39:
             case 0x3a:
@@ -3354,8 +3366,9 @@
             case 'N':
                 return null;
 
-            case 'B':
-            case 'b':
+            case BC_BINARY:
+            case BC_BINARY_CHUNK:
+            case 'b': //maybe it's a mistype of BC_BINARY_CHUNK
                 _isLastChunk = tag == 'B';
                 _chunkLength = (read() << 8) + read();
                 break;
@@ -3379,7 +3392,10 @@
                 _isLastChunk = true;
                 _chunkLength = tag - 0x20;
                 break;
-
+            case 0x34: case 0x35: case 0x36: case 0x37:
+                _isLastChunk = true;
+                _chunkLength = (tag - 0x34) * 256 + read();
+                break;
             default:
                 throw expect("binary", tag);
         }
@@ -3402,13 +3418,14 @@
                 int code = read();
 
                 switch (code) {
-                    case 'b':
+                    case BC_BINARY_CHUNK:
+                    case 'b': //maybe it's a mistype of BC_BINARY_CHUNK
                         _isLastChunk = false;
 
                         _chunkLength = (read() << 8) + read();
                         break;
 
-                    case 'B':
+                    case BC_BINARY:
                         _isLastChunk = true;
 
                         _chunkLength = (read() << 8) + read();
@@ -3433,7 +3450,10 @@
                         _isLastChunk = true;
                         _chunkLength = code - 0x20;
                         break;
-
+                    case 0x34: case 0x35: case 0x36: case 0x37:
+                        _isLastChunk = true;
+                        _chunkLength = (code - 0x34) * 256 + read();
+                        break;
                     default:
                         throw expect("byte[]", code);
                 }
diff --git a/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java b/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java
index ffc1732..14b3096 100644
--- a/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java
+++ b/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java
@@ -170,6 +170,11 @@
         return _replyFault;
     }
 
+    @Override
+    public boolean checkAndReadNull() {
+        return _peek == 'N';
+    }
+
     /**
      * Starts reading the call
      * <p>
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/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java b/src/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java
index 8ac5fde..20c4187 100644
--- a/src/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java
+++ b/src/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java
@@ -80,6 +80,7 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -94,7 +95,7 @@
 
     private static Deserializer OBJECT_DESERIALIZER
             = new BasicDeserializer(BasicDeserializer.OBJECT);
-
+    private static ConcurrentHashMap _unrecognizedTypeCache = new ConcurrentHashMap();
     private static HashMap _staticSerializerMap;
     private static HashMap _staticDeserializerMap;
     private static HashMap _staticTypeMap;
@@ -647,7 +648,7 @@
                 deserializer = new ArrayDeserializer(subDeserializer.getType());
             else
                 deserializer = new ArrayDeserializer(Object.class);
-        } else {
+        } else if (_unrecognizedTypeCache.get(type) == null) {
             try {
                 Class cl = Class.forName(type, false, _loader);
                 deserializer = getDeserializer(cl);
@@ -655,7 +656,12 @@
                 log.warning("Hessian/Burlap: '" + type + "' is an unknown class in " + _loader + ":\n" + e);
                 _typeNotFoundDeserializerMap.put(type, PRESENT);
                 log.log(Level.FINER, e.toString(), e);
+                _unrecognizedTypeCache.put(type, new AtomicLong(1L));
             }
+        } else {
+            ((AtomicLong) _unrecognizedTypeCache.get(type)).incrementAndGet();
+            if (((AtomicLong) _unrecognizedTypeCache.get(type)).get() % 2000L == 0L)
+                ((AtomicLong) _unrecognizedTypeCache.get(type)).getAndSet(1L);
         }
 
         if (deserializer != null) {
diff --git a/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionSerializerTest.java b/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionSerializerTest.java
index 0b20240..75aa608 100644
--- a/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionSerializerTest.java
+++ b/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionSerializerTest.java
@@ -17,15 +17,18 @@
 package com.alibaba.com.caucho.hessian.io;
 
 import com.alibaba.com.caucho.hessian.io.base.SerializeTestBase;
-
-import org.junit.Assert;
-import org.junit.Test;
-
+import com.alibaba.com.caucho.hessian.io.beans.SubUser;
+import java.io.IOException;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 import java.util.Vector;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.Assert;
+import org.junit.Test;
 
 public class CollectionSerializerTest extends SerializeTestBase {
     @Test
@@ -40,6 +43,46 @@
     }
 
     @Test
+    public void testSubUser() throws IOException {
+        int times = 100;
+        final CountDownLatch latch = new CountDownLatch(times);
+        final AtomicInteger error = new AtomicInteger();
+        for (int i = 0; i < times; i++) {
+           new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    for (int j = 0; j < 100; j++) {
+                        try {
+                            SubUser subUser = new SubUser();
+                            subUser.setUserId(1);
+                            subUser.setUserName("tony");
+                            List<Integer> list1 = Arrays.asList(null, 3, 1);
+                            List<Double> list2 = Arrays.asList(null, 1.1, 1.2);
+                            List<Boolean> list3 = Arrays.asList(false, null, true);
+                            subUser.setAgeList(list1);
+                            subUser.setWeightList(list2);
+                            subUser.setSexyList(list3);
+                            SubUser serializeUser = baseHessian2Serialize(subUser);
+                            Assert.assertEquals(subUser.getAgeList(), serializeUser.getAgeList());
+                            Assert.assertEquals(subUser.getWeightList(), serializeUser.getWeightList());
+                            Assert.assertEquals(subUser.getSexyList(), serializeUser.getSexyList());
+                        } catch (Throwable e) {
+                            error.incrementAndGet();
+                        }
+                    }
+                    latch.countDown();
+                }
+            }).start();
+        }
+        try {
+            latch.await();
+            Assert.assertEquals(0, error.get());
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
     public void testListSerializer() throws Exception {
 
         List<Integer> list = new LinkedList<>();
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/HessianJavaSerializeTest.java b/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java
index 3a50709..5bb08a3 100644
--- a/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java
+++ b/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java
@@ -24,10 +24,12 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * fix hessian serialize bug:
  * the filed of parent class will cover the filed of sub class
- *
  */
 public class HessianJavaSerializeTest extends SerializeTestBase {
 
@@ -54,6 +56,23 @@
 
     }
 
+
+    @Test
+    public void testSubUserWage() throws Exception {
+        SubUser subUser = new SubUser();
+        subUser.setUserId(1);
+        subUser.setUserName("tom");
+        List<Integer> list = new ArrayList<>();
+        list.add(null);
+        list.add(null);
+        list.add(3);
+        subUser.setAgeList(list);
+
+        SubUser serializedUser = baseHessian2Serialize(subUser);
+        Assert.assertEquals(subUser.getAgeList(), serializedUser.getAgeList());
+
+    }
+
     @Test
     public void testGetGrandsonUserName() throws Exception {
         GrandsonUser grandsonUser = new GrandsonUser();
@@ -64,4 +83,12 @@
         Assert.assertEquals("tom", serializedUser.getUserName());
     }
 
+    @Test
+    public void testFloat() throws Exception {
+        Float fData = 99.8F;
+        Double dData = 99.8D;
+        Assert.assertEquals(dData, baseHessianSerialize(fData));
+        Assert.assertEquals(dData, baseHessian2Serialize(fData));
+    }
+
 }
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;
diff --git a/src/test/java/com/alibaba/com/caucho/hessian/io/beans/SubUser.java b/src/test/java/com/alibaba/com/caucho/hessian/io/beans/SubUser.java
index 3c7214f..7553f48 100644
--- a/src/test/java/com/alibaba/com/caucho/hessian/io/beans/SubUser.java
+++ b/src/test/java/com/alibaba/com/caucho/hessian/io/beans/SubUser.java
@@ -17,19 +17,49 @@
 package com.alibaba.com.caucho.hessian.io.beans;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
+ *
  */
 public class SubUser extends BaseUser implements Serializable {
     private static final long serialVersionUID = 4017613093053853415L;
     private String userName;
+    private List<Integer> ageList;
+    private List<Double> weightList;
+    private List<Boolean> sexyList;
 
     @Override
     public String getUserName() {
         return userName;
     }
+
     @Override
     public void setUserName(String userName) {
         this.userName = userName;
     }
+
+    public List<Integer> getAgeList() {
+        return ageList;
+    }
+
+    public void setAgeList(List<Integer> ageList) {
+        this.ageList = ageList;
+    }
+
+    public List<Double> getWeightList() {
+        return weightList;
+    }
+
+    public void setWeightList(List<Double> weightList) {
+        this.weightList = weightList;
+    }
+
+    public List<Boolean> getSexyList() {
+        return sexyList;
+    }
+
+    public void setSexyList(List<Boolean> sexyList) {
+        this.sexyList = sexyList;
+    }
 }