对象克隆--利用序列化和反序列化实现深度克隆

利用序列化和反序列化实现深度克隆,直接上代码:

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
	}
}

可直接运行该代码

发布了11 篇原创文章 · 获赞 4 · 访问量 5507

猜你喜欢

转载自blog.csdn.net/qq_34776233/article/details/80898881