在写原型模式的时候,在用clone()方法实现了的时候,发现对于深拷贝来说,会对每一个相关类添加clone方法.这样会增加代码量,故推荐在深拷贝的时候使用序列化与反序列化实行.参见于我写的原型模式.
在写序列化的时候,我想到关于子类继承实现序列化的问题,倘若是父类实现了Serializable接口,那直接对子类序列化即可.倘若父类没有实现,而子类实现了Serializable,那仅能得到子类属性而得不到其集成自父类的属性了.当然倘若都不实现Serializable,那在序列化的时候是会报错的.对象序列化的时候必须实现Serializable.
下面是父类实现了Serializable的代码:
当父类没有实现serializable,而子类实现的情况下,解决的办法是若父类有带参构造方法的时候,需要添加一个无参构造方法,子类中需要加上:
此方法在序列化时候自动调用,先序列化子类,然后序列化父类的属性.
在写序列化的时候,我想到关于子类继承实现序列化的问题,倘若是父类实现了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();
- }
此方法在序列化时候自动调用,先序列化子类,然后序列化父类的属性.
转载于:https://blog.51cto.com/memory/1170136