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字符串作爲序列化後的結果是否合理。