修复hessian在集合类反序列化时,包装类为null返回基本类型默认值的bug

fixes #8,  apache/dubbo#3640
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 f4b160d..fe8a126 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,25 @@
-## 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-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
 
 ```xml
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>hessian-lite</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6</version>
 <dependency>
 ```
 
diff --git a/pom.xml b/pom.xml
index cbee5eb..208810e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
     <groupId>com.alibaba</groupId>
     <artifactId>hessian-lite</artifactId>
     <packaging>jar</packaging>
-    <version>3.2.5-SNAPSHOT</version>
+    <version>3.2.7-SNAPSHOT</version>
     <name>Hessian Lite(Alibaba embed version)</name>
 
     <properties>
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/Hessian2Input.java b/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java
index 9cdef6a..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
@@ -3366,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;
@@ -3391,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);
         }
@@ -3414,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();
@@ -3445,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/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/HessianJavaSerializeTest.java b/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java
index 8aa7ac6..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
@@ -83,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));
+    }
+
 }