1. 程式人生 > >java物件深拷貝-

java物件深拷貝-

前幾天遇到一個需求,需要將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方法