MessagePack使用时要注意bean必须要有默认构造函数

在是用msgpack时可以通过两种方式来注册你的bean:

1 使用@Messagepack来标记你的类

2 使用代码注册:msgpack.register(T.class);

但是大家要注意必须要有默认构造函数否则messagepack就无法使用了.

wurfl 修改纪录<1>

虚假的MatchAll

在wurfl中有个matcher叫做:net.sourceforge.wurfl.core.matchers.CatchAllMatcher

实际上虽然这个类叫做cacheAll但是并不是如此的,首先请看到代码:

net.sourceforge.wurfl.core.classifiers.FilterChain:

public void filter(String userAgent, String deviceID) {

for (Iterator iterator = filters.iterator(); iterator.hasNext();) {
Filter filter = (Filter) iterator.next();
if (filter.canHandle(userAgent)) {
filter.filter(userAgent, deviceID);
break;
}
}
}

是那个break,实际上它的意思就是让每个明确的内容进入对应的filter中,这样利用matcher可以提高识别率或者其他的.

而在这里我想把一些虚拟的设备放进去,比如目前把UCWEB放进去了,下面是一些测试样例:

IUC(U;iOS 4.3.5;Zh-cn;320*480;)/UCWEB8.1.0.104/41/997

JUC (Linux; U; 2.3.4; zh-cn; GT-S5660; 320*480) UCWEB7.9.3.103/139/32160

我不希望去添加这些ua到patch中,这些ua太多了,而且意义不大,因为是同一个设备,至于怎么添加后面还有另外的解决方案这里先不提.

回到主题,我们现在就是要把break编程contiune就可以了,是这样的,但是wurfl有个很suck的地方,就是很多代码比较古老因此OO思想用的不好,比如:

FilterChain MatcherChina等这些类都没有接口方法,因此你只能直接extends这些类,问题是它的大部分属性又都是private的于是你不得不覆盖掉几乎所有的实现,现在我们就要覆盖实现了:

public void filter(String userAgent, String deviceID) {

for (Iterator iterator = filters.iterator(); iterator.hasNext();) {
Filter filter = (Filter) iterator.next();
if (filter.canHandle(userAgent)) {
filter.filter(userAgent, deviceID);
}
}
}

然后简单说下,怎么matcher的,现在这么改当然不能matcher,实际上你看过源码就知道,它的matcher是基于下面的组合:

Filter+Matcher+UserAgentNormalizer

Filter决定了有多少device可以被这个matcher查询,Matcher做的就是匹配设备,而我们这里的模糊匹配主要利用的这个地方,最后就是改变ua的序列化方法,你可以实现UserAgentNormalizer这个接口.

这些下一篇会详细介绍wurfl中关于matcher和filter的一些故事.

当然wurfl这个项目真的算不上优秀,很多代码质量比较差,需要一点点改.

对了最后提醒下上面这么改其实会有个害处就是初始化时间会大大加长,这个当然得益于list的遍历效率低下,这块也是需要之后再优化的,但好在这只是初始化时间,问题不是很大,之后也会介绍我是如何思考减少内存占用的方法,都不属于高科技的方法.

 

Fastwurfl基本的计划

之前因为公司的项目基本上把wurfl的源码都看了一遍,说实话其中还是看到很多粗糙的代码,这个也是比较让我suck的,特别是一些效率方面的代码.

我曾经试验过另外一个叫fastwurfl的工具,经过全局比较测试发现这个工具的识别率下降了,而它的速度主要体现在解析上大约快了4倍(确实比较夸张),但是这个牺牲了一些准确性,所以放弃了.

最后还是决定使用wurfl的原始代码,但是会增加一些filter和matcher,并且优化一些可配置点(原来代码确实比较粗糙).

过年计划分几次分享下即将展开的计划中的一些部分:

1 可以配置的读取字段:我认为不是所有字段在所有应用场景下有价值的而是有一部分才有价值,所以增加了字段配置,这样不仅解析快了还可以减少真实的内存消耗.

2 wurfl中的matcher其实是不少业务代码的,这块代码如果仔细整理下,可以减少一些这类代码,这样速度可以快很多.

3 对于一些无法识别的ua,我想过了还是做日志记录,之后可以通过转换工具转换出来,而且可以直接通过半自动模式匹配出是否或者可能属于哪款机型(这个还是比较有意思的事情之一)

写在重新写blog的时候

终于自己又一次搭建了blog.想想那已经是5年前的事情了.

自从党国开始了备案,我就由于种种原因无法备案成功,于是…加上当时自己的服务器到期了,一个人当时的收入还是很难cover的,所以放弃了.

之后找了一些免费空间可是用起来总是觉得很不舒服,于是很久很久都没有写,当年还写了一阵sina,但还是放弃了,原因只是没有那种写的感觉.

javaeye也写过一阵的,但基本仅限于一些技术的,自己的生活记录很少的,好吧…

至于为什么要开?

我只是想重新记录生活.

还有认真地总结自己的工作和生活,这是一种很有意思的过程,上周又翻出了很早的照片,一篇篇地看,那种感觉真的很好,所以,我觉得写日记并不是一个很差的习惯啊,为什么不可以呢?

有则多写,无则少写,坚持下去就好了,呵呵.

马上过年了,老实说并没有太多的感觉了,总结一年来发现自己没有做什么还背负了很多压力,其实有时候想想为什么想不起来什么,我怕我渐渐也和别人一样了,所以也有必要去记录一下,当时的心情,当时的故事.微薄用多了,我觉得自己的总结能力在下降,因为那140字技术真的很地.我说过长焦是初学者用的,微薄大概也是吧,长篇大论并不是那么容易写出来的,所以…

2012我又开始了.