Caused by: declares multiple JSON fields

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37793798/article/details/83589711

2018.10.31

文章目录

前言

某项目已上线的版本中,将ChildA类的实例通过ObjectOutputStream#writeObject12进行序列化并写入HDFS中;而后某个版本中,由于未采用继承的方法,该模块的开发者将功能等价的ChildB类和ChildA作为属性封装到TempParent类中。为了兼容两个版本,使之能正确地反序列化,同时考虑到日后TempParent类还可能添加其他的属性进行扩展,该作者计划将TempParent类的实例序列化成Json字符串,再通过instanceOfString还是ChildA来反序列化。当然这个设计是错误的,在此不讨论设计问题。

方法

在尝试使用Gson#toJson去序列化TempParent类实例时,发现该报错,观察发现是因为TempParent类中有一个ChildB的属性,而ChildB类的继承关系如下:

Class BParent {
    private String sameMember;
    // ...
}
final Class ChildB extends BParent {
    private String sameMember;
    // ... 
}

ChildB类与其父类都各自拥有一个名为sameMember的属性,因此当Gson#toJson()在序列化TempParentChildB属性时,就无法判断应该序列化哪个sameMember作为最终的结果。

关于这个问题,Google出来能解决问题的办法本质都是一样的:人为决定冲突的同名属性要选择哪个,也就是属性里添加声明,决定哪些属性不被序列化。

可参考的答案如下:

  1. 使用transient3
  2. 使用@Expose4

上述都是解决这个问题的可行方法。但个人觉得,应该深入地考虑下采用Json字符串作为序列化后的结果是否合理。


  1. Java ObjectOutputStream ↩︎

  2. How to Write Doc Comments for Java ↩︎

    扫描二维码关注公众号,回复: 4196689 查看本文章
  3. Use transient to mark fields unwanted ↩︎

  4. Use @Expose to mark fields unwanted ↩︎

猜你喜欢

转载自blog.csdn.net/m0_37793798/article/details/83589711