欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

子类继承之序列化解决方案

程序员文章站 2022-03-13 10:51:29
...
在写原型模式的时候,在用clone()方法实现了的时候,发现对于深拷贝来说,会对每一个相关类添加clone方法.这样会增加代码量,故推荐在深拷贝的时候使用序列化与反序列化实行.参见于我写的原型模式.
在写序列化的时候,我想到关于子类继承实现序列化的问题,倘若是父类实现了Serializable接口,那直接对子类序列化即可.倘若父类没有实现,而子类实现了Serializable,那仅能得到子类属性而得不到其集成自父类的属性了.当然倘若都不实现Serializable,那在序列化的时候是会报错的.对象序列化的时候必须实现Serializable.
下面是父类实现了Serializable的代码:
package serializable;

import java.io.Serializable;

public class SuperClass implements Serializable {

String name;
String age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}


}

package serializable;


public class SonClass extends SuperClass {
String sex;
String profession;

public String getSex() {
return sex;

}

public void setSex(String sex) {
this.sex = sex;
}

public String getProfession() {
return profession;
}

public void setProfession(String profession) {
this.profession = profession;
}

}


package serializable;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Test {
public static void main(String[] args) {
SonClass son = new SonClass();
son.setName("Alex");
son.setAge("20");
son.setProfession("fighter");
son.setSex("man");
SonClass son2=null;
try {
FileOutputStream ba = new FileOutputStream("text.txt");
ObjectOutputStream oo = new ObjectOutputStream(ba);
oo.writeObject(son);
oo.flush();
oo.close();

FileInputStream bi = new FileInputStream("text.txt");
ObjectInputStream oi = new ObjectInputStream(bi);
son2 = (SonClass) oi.readObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(son2.getName());
System.out.println(son2.getAge());
System.out.println(son2.getProfession());
System.out.println(son2.getSex());

}
}



当父类没有实现serializable,而子类实现的情况下,解决的办法是若父类有带参构造方法的时候,需要添加一个无参构造方法,子类中需要加上:

private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(name);
out.writeObject(age);

}

private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
in.defaultReadObject();
name = (String) in.readObject();
age = (String) in.readObject();
}



此方法在序列化时候自动调用,先序列化子类,然后序列化父类的属性.
相关标签: OO Java