设计思想

使用Xml-Rpc的好处是显而易见的, 轻量级, 直观, 简单. 但是, 因为引入了XML的表达方式, 也造成了带宽要求的急剧升高. 一个解决方法就是对XmlRpc中的元素进行编码. 将这些元素映射成那些不会在XML中使用的字符(ASC < 0×20). 这样, 就可以使用一个字节来代替元素名称. 从而大为节省带宽. 根据这个想法, 本人写了一个类库来完成这种映射功能.

元素映射
 methodCall  0×01  /methodCall  0×1F
 methodName  0×02  /methodName  0×1F
 params  0×03  /params  0×1F
 param  0×04  /param  0×1F
 value  0×05  /value  0×1F
 struct  0×06  /struct  0×1F
 array  0×07  /array  0×1F
 fault  0×08  /fault  0×1F
 methodResponse  0×09  /member  0×1F
 member  0×0A  /methodResponse  0×1F
 name  0×0B  /i4  0×1F
 data  0×0C  /int  0×1F
 i4  0×11  /boolean  0×1F
 int  0×12  /string  0×1F
 boolean  0×13  /double  0×1F
 string  0×14  /dateTime.iso8601  0×1F
 double  0×15  /base64  0×1F
 dateTime.iso8601  0×16  /name  0×1F
 base64  0×17  /data  0×1F

所有的</….>元素都被映射成为同一个编码. 然后通过栈进行匹配. 这样可以节省出很多编码.

点击这里下载XmlRpcHelper类库的Eclipse工程(包含工程文件, 源代码和jar包).

因为Xml-Rpc不支持Unicode, 所以对其进行了映射, 将每一个Unicode字符映射为\uXXXX的形式进行传送. 使用该库极为简单. 只需要引入package:

import com.lucent.lps.xml.*;

需要说明的是, 该库适合于对底层Transport能够进行控制的XmlRpc的实现. 也就是说, 不能使用标准的http协议, 而应该重写XmlRpc的Transport(绝大多数情况下这是必须的, 因为绝大多数情况下推拉式的访问并不能满足系统的要求, Sever也是人, 当然也应该有说话的权利).

测试代码:

String test = "<?xml version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><int>4中文测试</int></value></member><member><name>faultString</name><value><string>Too many parameters.</string></value></member></struct></value></fault></methodResponse>";
   System.out.println("Original String: " + test + "\tlength = " + test.length());
   test = convertUnicode(test);
   System.out.println("Converted  String: " + test + "\t\tlength = " + test.length());
   byte [] ret = XmlRpcHelper.getInstance().encodeString(test);
   System.out.println("Encoded  String: " + new String(ret) + "\t\tlength = " + ret.length);
   
   XmlRpcHelper.getInstance().decodeString(ret);
   System.out.println("Decoded  String: " + res);
   res = restoreUnicode(res);
   System.out.println("Restored  String: " + res);

测试结果:

使用上述测试代码循环运行100000次. 压缩前字符长度为260, 压缩后为86.约为1/3. 压缩耗时结果如下:

 10万次循环  使用Unicode  不使用Unicode
 总运行时间(ms)  18157  5187
 平均单次运行时间(ms)  0.18  0.05

可见, 在使用了Unicode之后, 运行时间明显要比没有使用的时候长. 但是这样的Overhead并不影响Xml-Rpc.


评论

该日志第一篇评论

发表评论

评论也有版权!