[Java] PHPRPC 3.0.2 for Java 中增强了对容器接口的支持

andot 2009-02-16
PHPRPC for Java 在 3.0.2 之前,对容器接口还不提供支持,比如发布方法的参数类型和返回值不能声明为 List、Map 等接口类型,客户端的代理接口也不行。

而在 3.0.2 中,已经没有这个限制了,不管是参数类型还是返回值类型都可以声明为 List、Map、Set、Collection 这四种容器类型。当用这些接口类型接收数据时,List、Collection 会被转换成 ArrayList 类型,Set 会被转换成 HashSet 类型,Map 会被转成 HashMap 类型。另外,自定义类型如果继承自某个接口类型,同样可以使用接口类型来声明这样的参数和返回值。因此,你原来已有的业务逻辑代码在不需要任何修改的情况下,就可以作为 PHPRPC 服务进行发布了!
CshBBrain 2010-07-15
将3.0.2for Java 现在下来看了下;测试了一把的确支持容器。但测试过程中发现phprpc默认序列化参数时,会将我放在Object数组中的 String 类型的对象 转变成 byte[]类型的对象 会引起调用出错。仔细读了下源代码
PHPSerializer.java文件中的 “private Object unserialize(ByteArrayInputStream stream, ArrayList objectContainer) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException” 方法中的如下代码(文件的739行):
        case __s:
            obj = readString(stream);
            objectContainer.add(obj);
            return obj;
        case __S:
            obj = readEscapedString(stream);
            objectContainer.add(obj);
            return obj;
中调用的readString和readEscapedString方法将String转换成了byte[]类型;将此处代码修改为如下:
        case __s:
           obj = getString(readString(stream));
            objectContainer.add(obj);
            return obj;
        case __S:
            obj = getString(readEscapedString(stream));
            objectContainer.add(obj);
            return obj;
解决我遇到的问题,麻烦 andot 帮忙看下,这样修改有没有副作用。
andot 2010-07-15
有点副作用,那就是当传输的数据是字节数组时,这样修改之后运行是就会出错了。因为PHPRPC里面序列化二进制字符串和UTF8字符串是没有区别的,因此只能以二进制字符串来反序列化才能保证数据安全。

在PHPRPC商业版的Hprose中,这个问题已经不存在了。因为在Hprose中二进制数据和字符串是采用不同形式表示的,所以不存在这个问题。
Global site tag (gtag.js) - Google Analytics