Skip to content

Instantly share code, notes, and snippets.

@dolt131943
Created September 25, 2014 02:42
Show Gist options
  • Save dolt131943/ffc86379c124a9ec0bb5 to your computer and use it in GitHub Desktop.
Save dolt131943/ffc86379c124a9ec0bb5 to your computer and use it in GitHub Desktop.
Hessian序列化问题(父类与子类重复定义了一个Bean属性时会导致值丢失的问题)
class BaseClass implements Serializable{
private String context;
public getContext/setContext...
}
class SubClass extends BaseClass implements Serializable {
private String context;
public getContext/setContext...
}
//==============test==================
SubClass ins = new SubClass();
ins.setContext("testString");//只设置到子类的private变量上,父类没有。经测试即使使用强制类型转换为父类再调用set方法也无法设置值。(理论上讲也是的,方法被子类覆盖了)
/*
上述数据在使用Hessian传输时会发生无法反序列化这个字段。经跟踪代码发现问题如下:
==序列化==
Hessian在序列时读取的子类与父类的所有Fields,读取出所有的name及对应的value进行输出(输出的field name里不包括对应的类从属关系)
!!但在处理context时,读取到两个同名属性(父类与子类的)先讲到子类再父类,进行输出时也是先输出子类的再输出父类。然后父类的值是空的。!!
==反序列化==
Hessian在进行反序列化时从输入中读取到字段(含上面输出的两个重复字段),然后根据字段名将值设置到新的实例中,此时出问题了,context设置了两遍,第二个null把第一个的值覆盖掉了。从而导致了在应用方看起来的值丢失的情况。
另外一个问题:父类与子类属性重复是不合理的。
最终解决方案:1.绕过:不要出现这种子父类同名属性和方法的情况;
2.更改修正Hessian序列,使用Bean方法比遍历属性可能更好些。(要改Hessian的实现)
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment