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.