序列化可以实现深拷贝
1. 深拷贝
复制对象将所有原对象引用的对象全部复制一份。注意是所有的引用对象,包括引用对象的引用对象都会复制一份的。这个在代码的实验中证明了。详见另一篇博客 设计模式——原型模式——深拷贝
在Attachment中加入了Cat对象,cat对象序列化后== 结果是false
将对象写入文件流或者字符流中代码
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("ku", 8);
ObjectStream.WriteObject(dog);
Dog dog1 = (Dog) ObjectStream.ReadObject("D:/对象序列化.obj");
System.out.println(dog1);
System.out.println(dog1 == dog);
System.out.println(dog1.equals(dog));
}
}
class ObjectStream{
public static void WriteObject(Object o){
try {
OutputStream file = new FileOutputStream(new File("D:/对象序列化.obj"));
ObjectOutputStream oos = new ObjectOutputStream(file);
oos.writeObject(o);
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object ReadObject(String s){
try {
InputStream file = new FileInputStream(s);
ObjectInputStream ois = new ObjectInputStream(file);
Object o = ois.readObject();
ois.close();
return o;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
class Dog implements Serializable{
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public Dog() {
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
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;
}
}
输出:
Dog{name=’ku’, age=8}
false
false