【Caused by】declares multiple JSON fields

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 ↩︎

  3. Use transient to mark fields unwanted ↩︎

  4. Use @Expose to mark fields unwanted ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章