java学习笔记#6-对象的序列化与反序列化

序列化就是将object转为byte序列,反之叫做反序列化。

  • 序列化流(ObjectOutputStream):是过滤流,主要方法writeObject
  • 反序列化流(ObjectInputStream):readObject
  • 序列化接口(Serializable):对象必须实现序列化接口才能进行序列化。这个接口没有任何方法,但是却是必须的规定。
public class Student  implements Serializable{
    private String studentName;
    private String studentAge;
    private String studentNum;
...

    String file = "./fileIOTestFileFolder/obj.txt";
    public void objectToBytes() throws IOException{
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
        Student studentZhang = new Student("zhang","21","001");
        objectOutputStream.writeObject(studentZhang);
        objectOutputStream.close();
        System.out.println("finish object to bytes. result in obj.txt");
    }

    public void bytesToObject() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
        Student studentZhang = (Student)objectInputStream.readObject();
        System.out.println(studentZhang);
        objectInputStream.close();
    }

transient关键字

object中,拥有该关键字的属性不会被jvm默认的序列化。但是可以随后自行序列化。

public class Student  implements Serializable{
    private String studentAge;
    private String studentNum;
    private transient String studentName;

...

    private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{
        s.defaultWriteObject();
        s.writeObject(studentName);//自行完成studentName序列化
    }

    private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();
        this.studentName =(String)s.readObject();//自行完成studentName反序列化
    }
}

其中default为进行JVM默认的序列化操作。

transient 关键字乍一看很鸡肋,使得我们需要将原本自动完成的内容进行手都编写序列化,但是transient 可以提高序列化的性能。对于一些特殊的对象,比如对象中的一个未满的数组。如果自动序列化,则该数组会全部序列化,但是如果我们的数组只使用了一半,则有一半不需要的部分被序列化了。

java ArrayList的源码内可以看到相关的一些操作。

序列化过程中存在子类父类关系时,对子类对象进行反序列化时如果其父类没有实现序列化接口,则其父类的构造函数将会被显式调用。

你可能感兴趣的:(java学习笔记#6-对象的序列化与反序列化)