版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37793798/article/details/83589711
2018.10.31
前言
某项目已上线的版本中,将ChildA
类的实例通过ObjectOutputStream#writeObject
12进行序列化并写入HDFS中;而后某个版本中,由于未采用继承的方法,该模块的开发者将功能等价的ChildB
类和ChildA
作为属性封装到TempParent
类中。为了兼容两个版本,使之能正确地反序列化,同时考虑到日后TempParent
类还可能添加其他的属性进行扩展,该作者计划将TempParent
类的实例序列化成Json字符串,再通过instanceOf
是String
还是ChildA
来反序列化。当然这个设计是错误的,在此不讨论设计问题。
方法
在尝试使用Gson#toJson
去序列化TempParent
类实例时,发现该报错,观察发现是因为TempParent
类中有一个ChildB
的属性,而ChildB
类的继承关系如下:
Class BParent {
private String sameMember;
// ...
}
final Class ChildB extends BParent {
private String sameMember;
// ...
}
ChildB
类与其父类都各自拥有一个名为sameMember
的属性,因此当Gson#toJson()
在序列化TempParent
的ChildB
属性时,就无法判断应该序列化哪个sameMember
作为最终的结果。
关于这个问题,Google出来能解决问题的办法本质都是一样的:人为决定冲突的同名属性要选择哪个,也就是属性里添加声明,决定哪些属性不被序列化。
可参考的答案如下:
上述都是解决这个问题的可行方法。但个人觉得,应该深入地考虑下采用Json字符串作为序列化后的结果是否合理。
How to Write Doc Comments for Java ↩︎
扫描二维码关注公众号,回复: 4196689 查看本文章