最近有一個(gè)需求诱建,要先把文件從U盤拷貝到sd卡寒亥。而這個(gè)文件的路徑則和一個(gè)生成的數(shù)據(jù)有關(guān)系运授,也就是說之前我保存的路徑是U盤的路徑,最后生成的時(shí)候則需要實(shí)際在sd卡的路徑够颠。這很簡單熙侍,把路徑改了不就成了?
沒那么簡單履磨,萬一sd卡內(nèi)存不夠呢蛉抓?不夠你復(fù)制,這個(gè)時(shí)候你前面已經(jīng)復(fù)制了剃诅,路徑也改了巷送,數(shù)據(jù)已經(jīng)被“污染”了,只能從頭再配置一遍矛辕。這顯然是不合理的做法笑跛,所以需要我們拷貝一份原有的數(shù)據(jù)。但是在Java中默認(rèn)是引用拷貝聊品,并不是在堆里面給你另外分配一塊內(nèi)存飞蹂,給你一個(gè)新的對象,而是拷貝一個(gè)引用給你翻屈。這并沒有什么卵用陈哑,操作的是堆內(nèi)的同一個(gè)對象,依舊逃不過數(shù)據(jù)被污染的命。所以需要我們自己實(shí)現(xiàn)深度拷貝惊窖。
我首先能想到的方案有兩個(gè):
- 遍歷這個(gè)類的所有屬性刽宪,將每一個(gè)屬性都拷貝一份
- 先將對象序列化寫入文件,再從文件中讀取對象
第一種方式在類比較簡單的時(shí)候還是比較實(shí)用的界酒,我們?yōu)槊恳粋€(gè)屬性申請內(nèi)存并將值設(shè)置好纠屋。但是如果這個(gè)類內(nèi)部的屬性很復(fù)雜或者有比較復(fù)雜的父類,這個(gè)時(shí)候處理起來就麻煩很多了盾计。第二種方式簡單是簡單售担,本來也打算就用這種方式來做。后來同事提醒我還有第三種方式:利用Json框架署辉。
是的利用Json框架比如Gson或者FastJson之類的族铆,可以很簡單的將一個(gè)實(shí)體類轉(zhuǎn)化為字符串,然后我們再將這個(gè)字符串轉(zhuǎn)換成一個(gè)實(shí)體對象哭尝,代碼如下:
Gson g = new Gson();
// 假設(shè)此處t是一個(gè)指向堆內(nèi)對象的引用
String s = g.toJson(t);
T newT = g.fromJson(s, T.class);