java对象深拷贝-

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang_xiaomeng/article/details/83660301

前几天遇到一个需求,需要将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方法

猜你喜欢

转载自blog.csdn.net/zhang_xiaomeng/article/details/83660301