差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
java:jackson:deepclone [2021/07/03 17:31] tony [Problem] |
java:jackson:deepclone [2023/06/25 09:48] (目前版本) |
||
---|---|---|---|
行 2: | 行 2: | ||
====== DeepClone with Jackson ====== | ====== DeepClone with Jackson ====== | ||
===== Problem ===== | ===== Problem ===== | ||
- | 最近因為有人code沒寫好的原因,造成了Optional之亂;而始作俑者聲稱這問題很難解,促成我寫這篇文章的原因。原始問題發生在透過Gson對有Guava Optional做為member的物件做deepClone時,會拋出例外: | + | <del>最近因為有人code沒寫好的原因,造成了Optional之亂;而始作俑者聲稱這問題很難解,促成我寫這篇文章的原因。</del>原始問題發生在透過Gson對有Guava Optional做為member的物件做deepClone時,會拋出例外: |
<code java> | <code java> | ||
public class ParentObject { | public class ParentObject { | ||
行 13: | 行 13: | ||
這個問題發生在Gson無法將Json內容轉回Guava Optional的物件。首先網上已有許多針對Optional使用的討論,這裡不涉及使用的議題;而以Gson來說,可以透過TypeAdapter去解決物件轉換的問題,請參考此[[https://stackoverflow.com/questions/12161366/how-to-serialize-optionalt-classes-with-gson|link]]。\\ | 這個問題發生在Gson無法將Json內容轉回Guava Optional的物件。首先網上已有許多針對Optional使用的討論,這裡不涉及使用的議題;而以Gson來說,可以透過TypeAdapter去解決物件轉換的問題,請參考此[[https://stackoverflow.com/questions/12161366/how-to-serialize-optionalt-classes-with-gson|link]]。\\ | ||
\\ | \\ | ||
- | 本篇文章主要分享Jackson的解法。詳細程式碼可以參考[[https://github.com/frank007love/JacksonPractice/tree/master/src/test/java/org/tonylin/practice/jackson/optional|link]]。 | + | Jackson會有相同問題,本篇文章主要分享Jackson的解法。詳細程式碼可以參考[[https://github.com/frank007love/JacksonPractice/tree/master/src/test/java/org/tonylin/practice/jackson/optional|link]]。 |
===== How to? ===== | ===== How to? ===== | ||
解決Jackson Json轉換問題的方法之一,是在欄位掛載@JsonSerialize與@JsonDeserialize,可以參考[[java:jackson:annotation:jsonserialize:convertdate|link]]。今天分享給大家的,是直接使用別人的做好的模組,來減少維護的負擔。 | 解決Jackson Json轉換問題的方法之一,是在欄位掛載@JsonSerialize與@JsonDeserialize,可以參考[[java:jackson:annotation:jsonserialize:convertdate|link]]。今天分享給大家的,是直接使用別人的做好的模組,來減少維護的負擔。 | ||
行 131: | 行 131: | ||
</code> | </code> | ||
如果不是要求回應即時的系統,這三個值應都可以被接受。對Jackson熟悉的人,必定知道還有TokenBuffer的做法,可以提升效率;這部分之後有機會我會再提供教學。另外提供2021年針對Jackson VS Gson的實驗參考給大家: [[https://www.ericthecoder.com/2020/10/13/benchmarking-gson-vs-jackson-vs-moshi-2020/|link]],Jackson勝利。 | 如果不是要求回應即時的系統,這三個值應都可以被接受。對Jackson熟悉的人,必定知道還有TokenBuffer的做法,可以提升效率;這部分之後有機會我會再提供教學。另外提供2021年針對Jackson VS Gson的實驗參考給大家: [[https://www.ericthecoder.com/2020/10/13/benchmarking-gson-vs-jackson-vs-moshi-2020/|link]],Jackson勝利。 | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | 友藏內心的獨白: 解一個問題不需要5分鐘,但寫篇教學花費我5個小時。 | ||
===== Reference ===== | ===== Reference ===== | ||
* [[https://stackoverflow.com/questions/49903859/deep-copy-using-jackson-string-or-jsonnode|Deep Copy using Jackson: String or JsonNode]] | * [[https://stackoverflow.com/questions/49903859/deep-copy-using-jackson-string-or-jsonnode|Deep Copy using Jackson: String or JsonNode]] |