2005年12月15日

设计思想

使用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.

2005年12月03日

转载, 原文地址: http://vip.rongshuxia.com/rss/bbs_viewart_1.rs?bid=108981&aid=6645#6645

据查,是2000年5月14日的《实话实说》节目。我没看过那一期《实话实说》,但看过这一篇文章,当时就被深深地感动,其实重要的不是他是哪一国人,而是在这个物欲社会中安于清贫、坚守自己做人的良心、坚守自己理想的精神。

  丁大卫是个美国人。我认识他是在电视上。这个美国人带给了我深深的感动。我受到深深感动的这天是中央电视台《实话实说》节目组请到了丁大卫。我打开电视,就听到丁大卫在与崔永元唠嗑。崔永元老笑,而丁大卫很诚恳的样子。

  丁大卫的故事是这样的:5年前,美国青年丁大卫来到中国。他到了中国一所最普通的郊区小学教学。这个美国青年因为做人与教学深得人的喜欢,后来居然当上了校长。大概是1998年底,想到中国西部去看一看的丁大卫到了甘肃兰州。他到西北民族学院应聘当大学教师。丁大卫不是一个能侃的人,机智的崔永元是这样“套”丁大卫的。

  “丁大卫,你去大学应聘的时候,是不是这样说的:‘我曾是一名小学教师,积累了一些教学经验,所以来你校应聘大学教师?’”没想到丁大卫这样回答:“大概就是这样的。”大卫的话让现场很多观众都会心地笑了。

  更有意思的还在后头。学校给大卫定的工资是每月1200元。大卫去问别人,1200元在兰州是不是很高了?别人说,是算高了。于是,大卫主动找到学校,让人把工资降到900元。学校一再坚持,大卫不让,说:怎么也不能超过1000元。最后,学校给他每月950元。这段经历本来很好笑,但是我注意到现场没一个人笑。

  崔永元问:“大卫,你每月工资够用吗?”大卫说:“够了,我每月的钱除了买些饭票,就用来买些邮票,给家里打打电话,三四百元就够了!”

  我听见观众中有不少人“哇”地一声发出惊叹。我知道是有人灵魂受到触动了,而这种触动是我们的教科书和父母的教化所达不到的。而真正让我感动的还是以下一幕:

  别出心裁的编导在做这一期节目时,让丁大卫带来了他所有的家当. 一只还不及我们平常出门旅游背的那么大而“内容”丰富的帆布袋。而让我们怎么也想不到的是,这便是一个美国青年在中国生存5年积累下的我们肉眼看得到的财富。崔永元让丁大卫向大家展示一下他的家当,大卫的脸红了一下,打开了他的帆布袋,里面的东西是这样的:

  1、一顶大卫家乡足球队的队帽。他戴着向人展示时,我看见了他眼里的骄傲。

  2、一本相册。里面是他亲人、朋友,还有他教过的学生的照片。

  3、一个用精致相框镶好的一家人温馨亲昵的合影(大卫从包里掏出时,相框面上的玻璃被压碎了,大卫的脸上露出不易察觉的心痛的表情。不一会儿,节目组的人把一个赶着去买来的相框送给了大卫。中央台这一着似平凡的举动令我感动和叹服,它是那么及时地体现了善解人意的内涵和我们对外国友人的尊重)。

  4、两套换洗的衣服,其中有一件军装上装。那是大卫爸爸年轻时当兵穿过的,整整40年了。大卫向观众展示时,很有些骄傲地说:因为它漂亮啊!

  5、一双未洗的普通的运动鞋。那甚至不是一双品牌球鞋,大卫将它拿出来的时候,说什么也不让崔永元碰一下,他说:“这鞋很臭的!”

  6、几件以饭盆、口杯、牙刷、剃须刀为阵容的生活必需品。

  7、一面随身带着的鲜艳的五星红旗。

  当美国青年丁大卫将一面中国国旗打开,向现场的观众展示时,偌大的演播厅里鸦雀无声,现场乐队深情地奏响了《我的祖国》的旋律。崔永元问大卫:你怎么会时时将五星红旗带在身边?丁大卫说:我时时带着它,就是为了提醒自己,我现在是在中国,我要多说美丽的中文,有人到我房间里来,看着墙上挂着的五星红旗,也会缩小我们之间的差距。再说,看到这面国旗,我就会告诫自己:你现在是一位中国教师,你要多为中国教书育人。

  丁大卫的普普通通的话,让我从另一个角度认识了我们的国旗,也让我的眼泪不听话地掉下来。当崔永元问丁大卫在中国感觉苦不苦时,丁大卫说,很好的,比如这次你们中央台就让我这样一个平凡的人来做嘉宾,而且还让我坐飞机,吃很好的饭菜。我看见崔永元有些不好意思地脸红了,他幽默地说:“我觉得你挺像我们中国的一个人?雷锋!”丁大卫想了想,说:“还真有点儿像。”大伙儿“轰”地一声善意地笑开了。“只是,雷锋挺平常的,他只是一个凭良心做事的人,这样的人不应该只有一个,每个人都应该做得到的!”他认真地补充道。没有人再笑了,就连崔永元的脸上都显出了小学生的表情。节目快结束时,崔永元对丁大卫说:“丁大卫,你听到过人家对你的评价吗?”丁大卫笑笑说:“没有!”崔永元说:“好,现在我们就让你来听听。”我们于是看到了这样一组外采镜头:

  许多丁大卫的同事,丁大卫教过的学生,以及学生的家长在镜头前交替着出现,他们一一地说着丁大卫的可敬与可爱之处,有的人情到深处时,甚至泪盈于眶。一个大学女孩对着镜头说:“丁老师从来没骂过我,但我真的好怕他啊,因为我怕看他因我而失望的样子!”而最后我们看到的一个镜头是:丁老师教过的那所小学的孩子们,一个个争着抢到镜头前流着泪喊:你回来教我们吧!

  我们看见,丁大卫不敢再看大屏幕,他深深地把头埋下。一个美国青年,却在中国得到了人世间最珍贵的东西,我的心为之一颤。朴素的平凡的甚至不很英俊的丁大卫,给我们上了最有教益的一课!这样的一课,我们的课本上是没有的