修复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));
+ }
+
}