java物件深拷貝-
阿新 • • 發佈:2018-11-23
前幾天遇到一個需求,需要將java物件複製下,但是總是複製的引用。而不是隻複製物件的屬性值。如果物件還包含另一個物件。就更麻煩了。
package com.sunlands.community.common.entity; import java.io.*; public class TestDTO implements Serializable { private static final long serialVersionUID = 1L; private String field1; private String field2; private InnerDTO innerDTO; public String getField2() { return field2; } public void setField2(String field2) { this.field2 = field2; } public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public InnerDTO getInnerDTO() { return innerDTO; } public void setInnerDTO(InnerDTO innerDTO) { this.innerDTO = innerDTO; } public Object deepClone() throws IOException, OptionalDataException, ClassNotFoundException { // 將物件寫到流裡 ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(this); // 從流裡讀出來 ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return (oi.readObject()); } }
package com.sunlands.community.common.entity; import java.io.*; /** * Created by 67534 on 2018/11/2. */ public class InnerDTO implements Serializable { private static final long serialVersionUID = 1L; private String data1; private String data2; public String getData1() { return data1; } public void setData1(String data1) { this.data1 = data1; } public String getData2() { return data2; } public void setData2(String data2) { this.data2 = data2; } public Object deepClone() throws IOException, OptionalDataException, ClassNotFoundException { // 將物件寫到流裡 ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(this); // 從流裡讀出來 ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return (oi.readObject()); } }
深拷貝執行程式碼:
TestDTO testDto = new TestDTO();
TestDTO testDtoTemp= (TestDTO)testDto.deepClone();
物件包含的類也需要實現deepClone方法