Created
September 25, 2014 02:42
-
-
Save dolt131943/ffc86379c124a9ec0bb5 to your computer and use it in GitHub Desktop.
Hessian序列化问题(父类与子类重复定义了一个Bean属性时会导致值丢失的问题)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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