序列化就是将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的源码内可以看到相关的一些操作。
序列化过程中存在子类父类关系时,对子类对象进行反序列化时如果其父类没有实现序列化接口,则其父类的构造函数将会被显式调用。
网友评论