對象克隆--利用序列化和反序列化實現深度克隆

利用序列化和反序列化實現深度克隆,直接上代碼:

package clone;import java.io.Serializable;
/**
 * 要實現Serializable
 * @author Jack
 *
 */
public class User implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -5007319993510922716L;
	private int id;
	private String name;
	private int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}


package clone;

import java.io.Serializable;
import java.util.List;
/**
 * 要實現Serializable
 * @author Jack
 *
 */
public class MySystem implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 5750212768684906174L;
	private int id;
	private String name;
	private User user;
	private List<User> users;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public List<User> getUsers() {
		return users;
	}
	public void setUsers(List<User> users) {
		this.users = users;
	}
}

package clone;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
 * 注意的是我們需要將需要克隆的類都要實現Serializable
 * @author Jack
 *
 */
public class BeanUtils {
	
	public static <T> T cloneTo(T t){
		T dist = null;
		
		ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
		
		ObjectOutputStream objOutStream = null;
		
		ObjectInputStream objInStream = null;
		
		try {
			objOutStream = new ObjectOutputStream(byteStream);
			objOutStream.writeObject(t);
			objOutStream.flush();
			
			objInStream = new ObjectInputStream(new ByteArrayInputStream(byteStream.toByteArray()));
			dist = (T) objInStream.readObject();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally {
			if (objOutStream != null){
				try {
                	objOutStream.close();
                	objOutStream = null;
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
			}
            if (objInStream != null){
            	try {
                	objInStream.close();
                	objInStream = null;
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
		}
		return dist;
	}
	
	public static void main(String[] args) {
		/**
		 * 單個對象的克隆
		 */
		User user = new User();
		user.setId(2);
		user.setAge(22);
		user.setName("jack");
		
		User user1 = cloneTo(user);
		user1.setAge(33);
		System.out.println(user.getAge());	//22
		System.out.println(user1.getAge());	//33
		
		/**
		 * 深度克隆(Mysystem中有User這個屬性)
		 */
		MySystem system = new MySystem();
		system.setId(1);
		system.setName("這是一個系統");
		system.setUser(user);
		
		MySystem system1 = cloneTo(system);
		system1.setName("這還是我的系統");
		System.out.println(system.getName()); //這是一個系統
		System.out.println(system1.getName()); //這還是我的系統
		
		/**
		 * 深度克隆之集合的深度克隆
		 */
		User userMain = new User();
		user.setId(2);
		user.setAge(22);
		user.setName("jackMain");
		
		User userBranch = new User();
		userBranch.setId(2);
		userBranch.setAge(22);
		userBranch.setName("jackBranch");
		
		MySystem systemMain = new MySystem();
		systemMain.setName("這還是我的系統Main");
		List<User> users = new ArrayList<>();
		users.add(userMain);
		systemMain.setUsers(users);
		
		MySystem systemBranch = cloneTo(systemMain);
		systemBranch.setName("這還是我的系統Branch");
		systemBranch.getUsers().add(userBranch);
		
		System.out.println(systemMain.getName()+":"+systemMain.getUsers().size());	//1
		System.out.println(systemBranch.getName()+":"+systemBranch.getUsers().size());//2
	}
}

可直接運行該代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章