Hessian 3.2.0的两个bug

在将Hessian从3.0.13升级到3.2.0时碰到两个bug和一个ClassLoader处理策略的改变的问题,在此记录下,希望能为使用Hessian 3.2.0的同学们提供点帮助,避免再走同样的弯路。

Bug 1:HessianInput的readObject(Class)无效
对于使用Hessian 1的同学而言,有可能会使用到HessianInput的readObject(Class)这个方法,以实现将输入流反序列化为指定的类实例,这在有一个场景中是很需要的,例如序列化时序列化的是一个子类对象,但反序列化时需要反序列化为父类,这个时候就非常需要这方法了,在Hessian 3.2.0之前的版本中这个没有问题,但升级到3.2.0后就出现问题了,指定了Class会无效。
跟踪Hessian 3.2.0代码,发现它把之前版本的HessianInput的readObject(Class)方法做了改动,改为了:

    String type = readType();

// hessian/3386
      if ("".equals(type)) {
    Deserializer reader;
    reader = _serializerFactory.getDeserializer(cl);

return reader.readMap(this);
      }
      else {
    Deserializer reader;
    reader = _serializerFactory.getObjectDeserializer(type);

return reader.readMap(this);
      }

从上面代码可以看出,只要序列化流中有类型信息,那么就完全忽视传入的指定的Class类型,而在hessian中貌似只有Map类型的才不会写type信息,其他都会写,所以就导致了这个地方大多数情况下都会无视传入的指定的Class类型,更让人郁闷的是,去看Hessian2Input.readObject(Class)方法,它的处理方式就是正确的,在type不为""的情况下,它的处理方式为:

Deserializer reader;
    reader = findSerializerFactory().getObjectDeserializer(type, cl);

return reader.readMap(this);

而默认的SerializerFactory的getObjectDeserializer的实现如下:

Deserializer reader = getObjectDeserializer(type);
    
    if (cl == null
    || cl.equals(reader.getType())
    || cl.isAssignableFrom(reader.getType())
    || HessianHandle.class.isAssignableFrom(reader.getType())) {
      return reader;
    }

if (log.isLoggable(Level.FINE)) {
      log.fine("hessian: expected '" + cl.getName() + "' at '" + type + "' ("
           + reader.getType().getName() + ")");
    }
    
    return getDeserializer(cl);

从上面这段代码的实现来看,是可以满足传入指定的Class类型的方式的需求的。

因此修正这个BUG的方法为,继承HessianInput,并覆盖它的readObject(Class)方法,将其中type不为""的处理方式改成和Hessian2Input一样,重新测试,OK。
这个Bug即使到最新的Hessian 3.2.1里也没有修复,因此暂时仍然需要自行处理。

Bug 2:当Map中或对象中有两个long[]时反序列化出错
这个问题还真要凑巧才能碰上,大家可以自己写段简单的程序测试一下,用Hessian2Input和Hessian2Output去完成下面datas对象的序列化和反序列化:

Map<String,Object> datas=new HashMap<String,Object>();
datas.put("1",new long[]{1L,-1L});
datas.put("2",new long[]{2L,-2L});

反序列化的时候会抛出UnsupportedOperationException或java.util.Map cannot assigned from null这样的异常信息,而且如果Map中只有一个long[]数组是不会抛异常的,诡异呀,跟踪Hessian 3.2.0代码,发现有个很诡异的地方,在有两个数组后,Hessian会调用BasicDeserializer中的readLengthList方法,这个方法中竟然没有对long[]数组的处理,而只有对其他布尔型数组、短整型数组、整型数组等的处理,而当long[]数组的情况调用这个方法时,即抛出了UnsupportedOperationException异常,而更搞的是BasicDeserializer中的readList方法中是有对long[]数组的处理的,于是基本可以判断是Hessian的开发者漏写了对long[]的处理。
修正这个bug可以采用这两种方法:
1、修改BasicDeserializer,在readLengthList方法中加上对LONG_ARRAY的处理;
2、升级为Hessian 3.2.1,修复了这个bug,修复方法和1相同。

在升级到Hessian 3.2.0或3.2.1时还有个需要注意的问题,对于有些需要操作序列化时ClassLoader的同学有可能会碰到,Hessian 3.2.0以前的版本是在反序列化之前获取线程上下文ClassLoader来获取Class的,但在3.2.0+后,改变了这个策略,改为了在SerializerFactory实例化的时候就去获取线程上下文ClassLoader,以后在反序列化时就不再去获取了,这个方式对于需要控制ClassLoader的同学来说会有点麻烦,但还好Hessian还提供了一个方式,就是允许在创建SerializerFactory对象时传入ClassLoader,这就爽了,不用像以前一样需要通过控制线程上下文ClassLoader了,这种方式更为优雅,值得推荐。

转载于:https://www.cnblogs.com/echozhjun/archive/2011/01/02/1924082.html

Hessian 3.2.0的两个bug(转)相关推荐

  1. android 9.0 一加6,一加6终于升级到安卓9.0,但这两个BUG令人遗憾!

    原标题:一加6终于升级到安卓9.0,但这两个BUG令人遗憾! 一加手机是OPPO的前任总经理刘作虎创立的一个手机品牌,所以一加至今因为刘作虎和OPPO有着妙不可言的关系!大多数是说它是OPPO的亲儿子 ...

  2. 两个0.1uf 电容造成的两个BUG

    两个0.1uf 电容造成的两个BUG 发布时间:2013-04-03 09:47:57 原文地址链接:http://bbs.ednchina.com/BLOG_ARTICLE_3011787.HTM, ...

  3. Android 8 WiFi断流,安卓8.0曝出重大bug,比国产手机WiFi断流严重多了

    原标题:安卓8.0曝出重大bug,比国产手机WiFi断流严重多了 某品牌的部分用户会经常将"WiFi断流"挂在嘴边,这到底是啥意思?顾名思义就是手机正常运行时突然断开WiFi连接, ...

  4. .NET 2.0 RC的一个Bug

    .NET 2.0 Bug   --虚拟COM口名出错 今天发现.NET 2.0 RC版本(2.0.50727)的一个BUG: 很简单的一句话 Dim ports As String() = Syste ...

  5. 今晚被两个bug 困扰---第一个,小程序数组传递到PHP后台变成了字符串,导致解析失败

    1.今晚被两个bug 困扰-第一个,小程序数组传递到PHP后台变成了字符串,导致解析失败 2.解决方法 小程序部分: var that = this; console.log(this.data.co ...

  6. OSChina 周四乱弹 ——前两天BUG还没改完啊?老子不改了!

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @=clouddyy  :#每日乱弹音乐# <Safe and S ...

  7. Redisson里的“看门狗”居然有这两个“bug”?

    ​大家好! 提到分布式锁,大家一般都会想到 Redis. 想到 Redis,一部分同学会说到 Redisson. 那么说到 Redisson,就不得不掰扯掰扯一下它的"看门狗"机制 ...

  8. 从两个bug来看Javascript的装载

    不管是做前端开发还是测试,我觉得都应对网页内容加载和执行有所了解,特别是JavaScript,否则迟早都会得到教训,在我写此文之前就得到过教训,所以印象特别深刻,当时也为了搞明白其中缘由,查了些资料, ...

  9. VS 2013 Preview 自定义 SharePoint 2013 列表 之 两个Bug

    SharePoint 2013 已RTM了,对于程序员来说又要了解新功能了,同时 VS 2013 也将要 RTM了,两者同时应用定会有不新功能,我们先从 自定义 列表开始. SharePoint 20 ...

最新文章

  1. 求表达式 f(n)结果末尾0的个数
  2. 两个文件比对_Edlib:方便快速的长序列比对软件包
  3. 查看MS SQL Server数据库每个表占用的空间大小
  4. python输出数据格式_这串数据有什么方法用python输出我想要的格式?
  5. oracle rac 错误日志路径,ORACLE 11G RAC--日志路径
  6. Result Maps collection already contains value for ***的问题
  7. k-近邻算法-优化约会网站的配对效果
  8. 业界分享 | 阿里达摩院:超大规模预训练语言模型落地实践
  9. dsp广告和信息流广告区别_信息流广告和sem广告有哪些区别2021?
  10. ai作文批改_有道词典上线AI作文批改功能,可自动批改雅思、四六级作文
  11. 打开计算机没显示硬盘分区,电脑新插了一个硬盘没显示怎么办
  12. ESP32 LVGL8.1 ——Roller 滚动 (Roller 24)
  13. java 第七章 数组
  14. c++编译提示:系统找不到指定路径
  15. 红外编解码模块YS-NEC使用
  16. 迅捷路由器设置找不到服务器,迅捷(FAST)路由器第一次怎么设置? | 192路由网
  17. 前端常见图片格式整理
  18. html实现边下边播mp4,WebTorrent:一款可边下边播磁力链接的播放器
  19. centos7下添加常用YUM源(EPEL/Remi/RPMforge/php/Nginx)
  20. Eureka的UNKNOWN

热门文章

  1. Vue简单入门及组件的简单使用
  2. hadoop入门学习教程--DKHadoop完整安装步骤
  3. 案例:Oracle dul数据挖掘 没有数据库备份非常规恢复truncate删除的数据表
  4. Android开发UI之GridLayout的使用
  5. saltstack event配合websocket客户端实时推送结果
  6. [Linux] Ubuntu13.04 搭建OK6410-A开发板的开发环境
  7. python 获取硬盘信息_使用python获取电脑的磁盘信息方法
  8. python用来自动修改pdf_python实现从pdf文件中提取文本,并自动翻译的方法
  9. linux利用位置参数数组,Shell编程1_变量、参数和数组
  10. 客户端连接idea_IDEA新特性:提前知道代码怎么走!