1. 程式人生 > 其它 >利用序列化和反序列化來實現物件的深拷貝

利用序列化和反序列化來實現物件的深拷貝

物件的深拷貝一般有三種:

1、在構造方法階段深拷貝:對每個屬性建立相同的字面量

2、實現Cloneable介面,告訴JVM這是一個可以拷貝的類,並重寫Object.clone()方法,實現對引用物件深度遍歷拷貝

3、就是通過序列化和反序列化的方式

import java.io.Serializable;


public class Address implements Serializable {
    String address;

    public Address(String address) {
        this.address = address;
    }

    
public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
import java.io.*;

public class User implements Serializable {
    String name;
    Address address;

    public User(String name, Address address) {
        
this.name = name; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) {
this.address = address; } // 實際的資料流向:ObjectOutputStream->ByteArrayOutputStream->ByteArrayInputStream ->ObjectInputStream,深度複製從序列化物件又轉為序列化物件 public User copy() throws IOException, ClassNotFoundException { // 序列化 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(this); // 將this物件 轉變為 二進位制位元組流 // 反序列化 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); return (User) objectInputStream.readObject(); } }
import java.io.IOException;

public class TestDeepCopy {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User u1 = new User("Liu Haoran", new Address("Henan Province"));
        User u2 = u1.copy();
        System.out.println(u1 == u2);   // u1和u2在Java堆中的地址不同
        // 但是二者的屬性的字面量是相同的
        System.out.println("u1:" + u1.getName() + " " + u1.getAddress().getAddress());
        System.out.println("u2:" + u2.getName() + " " + u2.getAddress().getAddress());
    }
}