java 序列化和反序列化实现克隆

package com.clone.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class TestClone{

	public static Hero clone(Hero hero) {
		Hero copy = null;
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos;
			oos = new ObjectOutputStream(baos);
			oos.writeObject(hero);
			//序列化可以写入文件。当然,也可以写入内存,然后在读取出来,这时候就实现了反序列化(克隆)
			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(bais);
			copy = (Hero) ois.readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return copy;
	}
	public static void main(String[] args) {
		
		Hero hero = new Hero("哈撒给", 2500, 18);
		System.out.println("英雄名字 "+(hero.getName() == clone(hero).getName()));
		System.out.println("宠物是否是同一个 "+(hero.getPet() == clone(hero).getPet()));
		System.out.println("英雄的血量相同否 "+(hero.getHP() == clone(hero).getHP()));
		System.out.println("英雄的宠物的名字相同否"+hero.getPet().getName() == clone(hero).getPet().getName());
		System.out.println("英雄的宠物的血量是否相同"+(hero.getPet().getHP() == clone(hero).getHP()));
		
		
	}
}

package com.clone.test;

import java.io.InputStream;
import java.io.Serializable;

public class Hero implements Serializable {

	private String name;//英雄名字
	private int HP;//血量
	private int level;//等级
	private Pet pet = new Pet("宝宝", 20, 1000);//一个英雄拥有的宠物
	private static int MP;//被标注为静态的属性也没有办法被序列化
	private transient InputStream is;//为了方便解释,加入一个没有办法实现serializable接口的对象,这时候就需要将它用transient标记
	private transient int a;//没有意义的一个变量

	// 当某个对象中的属性没有办法序列化,或者不需要将它序列化的时候可以使用关键字transient标记,就可以实现序列化的时候忽略

	public Hero(String name, int hP, int level) {
		super();
		this.name = name;
		HP = hP;
		this.level = level;
	}
	public Hero(String name, int hP, int level, InputStream is,
			int a) {
		super();
		this.name = name;
		HP = hP;
		this.level = level;
		this.is = is;
		this.a = a;
	}


	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getHP() {
		return HP;
	}

	public void setHP(int hP) {
		HP = hP;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}
	public static int getMP() {
		return MP;
	}
	public static void setMP(int mP) {
		MP = mP;
	}
	public Pet getPet() {
		return pet;
	}
	public void setPet(Pet pet) {
		this.pet = pet;
	}
	public InputStream getIs() {
		return is;
	}
	public void setIs(InputStream is) {
		this.is = is;
	}
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
}
class Pet implements Serializable{
	private String name;
	private int leval;
	private int HP;
	public String getName() {
		return name;
	}
	
	public Pet(String name, int leval, int hP) {
		super();
		this.name = name;
		this.leval = leval;
		HP = hP;
	}

	public void setName(String name) {
		this.name = name;
	}
	public int getLeval() {
		return leval;
	}
	public void setLeval(int leval) {
		this.leval = leval;
	}
	public int getHP() {
		return HP;
	}
	public void setHP(int hP) {
		HP = hP;
	}
	
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用序列化实现深拷贝。深拷贝是指创建一个全新的对象,将原始对象的所有属性值复制到新对象中。以下是一个简单的示例代码,演示如何通过序列化实现深拷贝: ```java import java.io.*; class MyClass implements Serializable { private int value; public MyClass(int value) { this.value = value; } public int getValue() { return value; } } public class DeepCopyExample { public static void main(String[] args) throws IOException, ClassNotFoundException { // 创建原始对象 MyClass originalObj = new MyClass(10); // 将原始对象序列化到字节数组输出流中 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(originalObj); oos.close(); // 从字节数组输入流中反序列化出新的对象 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); MyClass clonedObj = (MyClass) ois.readObject(); ois.close(); // 修改原始对象的值 originalObj.setValue(20); // 输出结果 System.out.println("Original value: " + originalObj.getValue()); System.out.println("Cloned value: " + clonedObj.getValue()); } } ``` 在上面的示例中,我们定义了一个名为`MyClass`的类,它实现了`Serializable`接口。然后,我们创建了一个原始对象`originalObj`,并将其序列化到字节数组输出流中。接着,我们通过反序列化从字节数组输入流中创建了一个新的对象`clonedObj`。最后,我们修改了原始对象的值,并输出了原始对象和克隆对象的值。 通过这种方式,我们实现了深拷贝,因为`clonedObj`是一个全新的对象,它的属性值与原始对象`originalObj`的属性值相同,但是它们之间没有引用关系。这意味着对其中一个对象的修改不会影响另一个对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值