This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new b2eb070  Merge pull request #1616, fix hessian1 serialized short, byte 
is converted to int.
b2eb070 is described below

commit b2eb070c9f1a6ba4dc8b2219690be73a471688b7
Author: yì jí <yiji.git...@hotmail.com>
AuthorDate: Thu May 10 17:47:47 2018 +0800

    Merge pull request #1616, fix hessian1 serialized short, byte is converted 
to int.
---
 .../com/caucho/hessian/io/HessianInput.java        | 66 ++++++++++++++++----
 ...ShortTest.java => Hessian1StringShortTest.java} | 72 +++++++++++++++++++---
 .../caucho/hessian/io/Hessian2StringShortTest.java | 54 ++++++++++++++++
 3 files changed, 171 insertions(+), 21 deletions(-)

diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java
index c71f310..417b756 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java
@@ -56,6 +56,7 @@ import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 
 /**
  * Input stream for Hessian requests.
@@ -999,7 +1000,15 @@ public class HessianInput extends AbstractHessianInput {
     @Override
     public Object readObject(Class cl)
             throws IOException {
-        if (cl == null || cl == Object.class)
+        return readObject(cl, null, null);
+    }
+
+    /**
+     * Reads an object from the input stream with an expected type.
+     */
+    public Object readObject(Class expectedClass, Class<?>... expectedTypes)
+            throws IOException {
+        if (expectedClass == null || expectedClass == Object.class)
             return readObject();
 
         int tag = read();
@@ -1011,17 +1020,23 @@ public class HessianInput extends AbstractHessianInput {
             case 'M': {
                 String type = readType();
 
+                boolean keyValuePair = expectedTypes != null && 
expectedTypes.length == 2;
+
                 // hessian/3386
                 if ("".equals(type)) {
                     Deserializer reader;
-                    reader = _serializerFactory.getDeserializer(cl);
+                    reader = _serializerFactory.getDeserializer(expectedClass);
 
-                    return reader.readMap(this);
+                    return reader.readMap(this
+                            , keyValuePair ? expectedTypes[0] : null
+                            , keyValuePair ? expectedTypes[1] : null);
                 } else {
                     Deserializer reader;
-                    reader = _serializerFactory.getObjectDeserializer(type, 
cl);
+                    reader = _serializerFactory.getObjectDeserializer(type, 
expectedClass);
 
-                    return reader.readMap(this);
+                    return reader.readMap(this
+                            , keyValuePair ? expectedTypes[0] : null
+                            , keyValuePair ? expectedTypes[1] : null);
                 }
             }
 
@@ -1032,12 +1047,14 @@ public class HessianInput extends AbstractHessianInput {
                 Deserializer reader;
                 reader = _serializerFactory.getObjectDeserializer(type);
 
-                if (cl != reader.getType() && 
cl.isAssignableFrom(reader.getType()))
-                    return reader.readList(this, length);
+                boolean valueType = expectedTypes != null && 
expectedTypes.length == 1;
+
+                if (expectedClass != reader.getType() && 
expectedClass.isAssignableFrom(reader.getType()))
+                    return reader.readList(this, length, valueType ? 
expectedTypes[0] : null);
 
-                reader = _serializerFactory.getDeserializer(cl);
+                reader = _serializerFactory.getDeserializer(expectedClass);
 
-                Object v = reader.readList(this, length);
+                Object v = reader.readList(this, length, valueType ? 
expectedTypes[0] : null);
 
                 return v;
             }
@@ -1061,7 +1078,7 @@ public class HessianInput extends AbstractHessianInput {
         // hessian/332i vs hessian/3406
         //return readObject();
 
-        Object value = _serializerFactory.getDeserializer(cl).readObject(this);
+        Object value = 
_serializerFactory.getDeserializer(expectedClass).readObject(this);
 
         return value;
     }
@@ -1073,6 +1090,15 @@ public class HessianInput extends AbstractHessianInput {
     @Override
     public Object readObject()
             throws IOException {
+        return readObject((List<Class<?>>) null);
+    }
+
+    /**
+     * Reads an arbitrary object from the input stream when the type
+     * is unknown.
+     */
+    public Object readObject(List<Class<?>> expectedTypes)
+            throws IOException {
         int tag = read();
 
         switch (tag) {
@@ -1137,13 +1163,29 @@ public class HessianInput extends AbstractHessianInput {
                 String type = readType();
                 int length = readLength();
 
-                return _serializerFactory.readList(this, length, type);
+                Deserializer reader;
+                reader = _serializerFactory.getObjectDeserializer(type);
+
+                boolean valueType = expectedTypes != null && 
expectedTypes.size() == 1;
+
+                if (List.class != reader.getType() && 
List.class.isAssignableFrom(reader.getType()))
+                    return reader.readList(this, length, valueType ? 
expectedTypes.get(0) : null);
+
+                reader = _serializerFactory.getDeserializer(List.class);
+
+                Object v = reader.readList(this, length, valueType ? 
expectedTypes.get(0) : null);
+
+                return v;
             }
 
             case 'M': {
                 String type = readType();
 
-                return _serializerFactory.readMap(this, type);
+                boolean keyValuePair = expectedTypes != null && 
expectedTypes.size() == 2;
+
+                return _serializerFactory.readMap(this, type
+                        , keyValuePair ? expectedTypes.get(0) : null
+                        , keyValuePair ? expectedTypes.get(1) : null);
             }
 
             case 'R': {
diff --git 
a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
 
b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian1StringShortTest.java
similarity index 70%
copy from 
hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
copy to 
hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian1StringShortTest.java
index b2a55e4..dfacf34 100644
--- 
a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
+++ 
b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian1StringShortTest.java
@@ -33,7 +33,7 @@ import java.util.Map;
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertTrue;
 
-public class Hessian2StringShortTest extends SerializeTestBase {
+public class Hessian1StringShortTest extends SerializeTestBase {
 
     @Test
     public void serialize_string_short_map_then_deserialize() throws Exception 
{
@@ -44,7 +44,7 @@ public class Hessian2StringShortTest extends 
SerializeTestBase {
         stringShortMap.put("last", (short)60);
         stringShort.stringShortMap = stringShortMap;
 
-        Hessian2StringShortType deserialize = 
baseHession2Serialize(stringShort);
+        Hessian2StringShortType deserialize = 
baseHessionSerialize(stringShort);
         assertTrue(deserialize.stringShortMap != null);
         assertTrue(deserialize.stringShortMap.size() == 2);
         assertTrue(deserialize.stringShortMap.get("last") instanceof Short);
@@ -61,7 +61,7 @@ public class Hessian2StringShortTest extends 
SerializeTestBase {
         stringByteMap.put("last", (byte)60);
         stringShort.stringByteMap = stringByteMap;
 
-        Hessian2StringShortType deserialize = 
baseHession2Serialize(stringShort);
+        Hessian2StringShortType deserialize = 
baseHessionSerialize(stringShort);
         assertTrue(deserialize.stringByteMap != null);
         assertTrue(deserialize.stringByteMap.size() == 2);
         assertTrue(deserialize.stringByteMap.get("last") instanceof Byte);
@@ -77,13 +77,13 @@ public class Hessian2StringShortTest extends 
SerializeTestBase {
         stringShortMap.put("last", (short)60);
 
         ByteArrayOutputStream bout = new ByteArrayOutputStream();
-        Hessian2Output out = new Hessian2Output(bout);
+        HessianOutput out = new HessianOutput(bout);
 
         out.writeObject(stringShortMap);
         out.flush();
 
         ByteArrayInputStream bin = new 
ByteArrayInputStream(bout.toByteArray());
-        Hessian2Input input = new Hessian2Input(bin);
+        HessianInput input = new HessianInput(bin);
         Map deserialize = (Map) input.readObject(HashMap.class, String.class, 
Short.class);
         assertTrue(deserialize != null);
         assertTrue(deserialize.size() == 2);
@@ -93,6 +93,33 @@ public class Hessian2StringShortTest extends 
SerializeTestBase {
     }
 
     @Test
+    public void serialize_map_then_deserialize0() throws Exception {
+
+        Map<String, Short> stringShortMap = new HashMap<String, Short>();
+        stringShortMap.put("first", (short)0);
+        stringShortMap.put("last", (short)60);
+
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        HessianOutput out = new HessianOutput(bout);
+
+        out.writeObject(stringShortMap);
+        out.flush();
+
+        ByteArrayInputStream bin = new 
ByteArrayInputStream(bout.toByteArray());
+        HessianInput input = new HessianInput(bin);
+        List<Class<?>> keyValueType = new ArrayList<Class<?>>();
+        keyValueType.add(String.class);
+        keyValueType.add(short.class);
+
+        Map deserialize = (Map) input.readObject(keyValueType);
+        assertTrue(deserialize != null);
+        assertTrue(deserialize.size() == 2);
+        assertTrue(deserialize.get("last") instanceof Short);
+        assertEquals(Short.valueOf((short)0), deserialize.get("first"));
+        assertEquals(Short.valueOf((short)60), deserialize.get("last"));
+    }
+
+    @Test
     public void serialize_string_person_map_then_deserialize() throws 
Exception {
 
         Hessian2StringShortType stringShort = new Hessian2StringShortType();
@@ -106,13 +133,13 @@ public class Hessian2StringShortTest extends 
SerializeTestBase {
         stringShort.stringPersonTypeMap = stringPersonTypeMap;
 
         ByteArrayOutputStream bout = new ByteArrayOutputStream();
-        Hessian2Output out = new Hessian2Output(bout);
+        HessianOutput out = new HessianOutput(bout);
 
         out.writeObject(stringShort);
         out.flush();
 
         ByteArrayInputStream bin = new 
ByteArrayInputStream(bout.toByteArray());
-        Hessian2Input input = new Hessian2Input(bin);
+        HessianInput input = new HessianInput(bin);
 
         Hessian2StringShortType deserialize = (Hessian2StringShortType) 
input.readObject();
         assertTrue(deserialize.stringPersonTypeMap != null);
@@ -138,13 +165,13 @@ public class Hessian2StringShortTest extends 
SerializeTestBase {
         shortList.add((short)60);
 
         ByteArrayOutputStream bout = new ByteArrayOutputStream();
-        Hessian2Output out = new Hessian2Output(bout);
+        HessianOutput out = new HessianOutput(bout);
 
         out.writeObject(shortList);
         out.flush();
 
         ByteArrayInputStream bin = new 
ByteArrayInputStream(bout.toByteArray());
-        Hessian2Input input = new Hessian2Input(bin);
+        HessianInput input = new HessianInput(bin);
         List<Short> deserialize = (List) input.readObject(ArrayList.class, 
Short.class);
         assertTrue(deserialize != null);
         assertTrue(deserialize.size() == 2);
@@ -153,4 +180,31 @@ public class Hessian2StringShortTest extends 
SerializeTestBase {
         assertEquals(Short.valueOf((short)60), deserialize.get(1));
     }
 
+    @Test
+    public void serialize_list_then_deserialize0() throws Exception {
+
+        List<Short> shortList = new ArrayList<Short>();
+        shortList.add((short)0);
+        shortList.add((short)60);
+
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        HessianOutput out = new HessianOutput(bout);
+
+        out.writeObject(shortList);
+        out.flush();
+
+        ByteArrayInputStream bin = new 
ByteArrayInputStream(bout.toByteArray());
+        HessianInput input = new HessianInput(bin);
+
+        List<Class<?>> valueType = new ArrayList<Class<?>>();
+        valueType.add(short.class);
+
+        List<Short> deserialize = (List) input.readObject(valueType);
+        assertTrue(deserialize != null);
+        assertTrue(deserialize.size() == 2);
+        assertTrue(deserialize.get(1) instanceof Short);
+        assertEquals(Short.valueOf((short)0), deserialize.get(0));
+        assertEquals(Short.valueOf((short)60), deserialize.get(1));
+    }
+
 }
diff --git 
a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
 
b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
index b2a55e4..69f56c1 100644
--- 
a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
+++ 
b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java
@@ -93,6 +93,34 @@ public class Hessian2StringShortTest extends 
SerializeTestBase {
     }
 
     @Test
+    public void serialize_map_then_deserialize0() throws Exception {
+
+        Map<String, Short> stringShortMap = new HashMap<String, Short>();
+        stringShortMap.put("first", (short)0);
+        stringShortMap.put("last", (short)60);
+
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        Hessian2Output out = new Hessian2Output(bout);
+
+        out.writeObject(stringShortMap);
+        out.flush();
+
+        ByteArrayInputStream bin = new 
ByteArrayInputStream(bout.toByteArray());
+        Hessian2Input input = new Hessian2Input(bin);
+
+        List<Class<?>> keyValueType = new ArrayList<Class<?>>();
+        keyValueType.add(String.class);
+        keyValueType.add(short.class);
+
+        Map deserialize = (Map) input.readObject(keyValueType);
+        assertTrue(deserialize != null);
+        assertTrue(deserialize.size() == 2);
+        assertTrue(deserialize.get("last") instanceof Short);
+        assertEquals(Short.valueOf((short)0), deserialize.get("first"));
+        assertEquals(Short.valueOf((short)60), deserialize.get("last"));
+    }
+
+    @Test
     public void serialize_string_person_map_then_deserialize() throws 
Exception {
 
         Hessian2StringShortType stringShort = new Hessian2StringShortType();
@@ -153,4 +181,30 @@ public class Hessian2StringShortTest extends 
SerializeTestBase {
         assertEquals(Short.valueOf((short)60), deserialize.get(1));
     }
 
+    @Test
+    public void serialize_list_then_deserialize0() throws Exception {
+
+        List<Short> shortList = new ArrayList<Short>();
+        shortList.add((short)0);
+        shortList.add((short)60);
+
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        Hessian2Output out = new Hessian2Output(bout);
+
+        out.writeObject(shortList);
+        out.flush();
+
+        ByteArrayInputStream bin = new 
ByteArrayInputStream(bout.toByteArray());
+        Hessian2Input input = new Hessian2Input(bin);
+
+        List<Class<?>> valueType = new ArrayList<Class<?>>();
+        valueType.add(short.class);
+
+        List<Short> deserialize = (List) input.readObject(valueType);
+        assertTrue(deserialize != null);
+        assertTrue(deserialize.size() == 2);
+        assertTrue(deserialize.get(1) instanceof Short);
+        assertEquals(Short.valueOf((short)0), deserialize.get(0));
+        assertEquals(Short.valueOf((short)60), deserialize.get(1));
+    }
 }

-- 
To stop receiving notification emails like this one, please contact
liu...@apache.org.

Reply via email to