6-1 序列化的基本操作
对象的序列化,反序列化
1)对象序列化就是将Object对象转化成byte序列,反之叫对象的反序列化
2)序列化流(ObjectOutputStream),是个过滤流 --- writeObjcet
反序列化流(ObjectInputStream), --- readObject
3)序列化接口(Serializable)
对象必须实现序列化接口,才能进行序列化,否则将出现异常
这个接口,没有任何方法,只是一个标准
package com.io;
import java.io.Serializable;
public class Student implements Serializable{
private String stuno;
private String stuname;
private int stuage;
public Student() {
}
public Student(String stuno, String stuname, int stuage) {
super();
this.stuno = stuno;
this.stuname = stuname;
this.stuage = stuage;
}
@Override
public String toString() {
return "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage=" + stuage + "]";
}
}
package com.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class ObjectSeriaDemo1 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String file = "demo/obj.dat";
// 1.对象的序列化
/*
* ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
* Student stu = new Student("1001", "张三", 20); oos.writeObject(stu);
* oos.flush(); oos.close();
*/
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
Student stu = (Student) ois.readObject();
System.out.println(stu);}
}
6-2 transient及ArrayList源码分析
private transient int stuage;// 该元素不会进行jvm默认的序列化,也可以自己完成这个元素的序列化
transient关键字
private void writeObject(java.io.ObjectOutputStream s) throws IOException {
s.defaultWriteObject(); // 把jvm能默认序列化的元素进行序列化操作
s.writeInt(stuage); // 自己完成stuage的序列化
}private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException {
s.defaultReadObject(); // 把jvm能默认反序列化的元素进行反序列化操作
this.stuage = s.readInt(); // 自己完成stuage的反序列化操作
}
分析ArrayList源码中序列化和反序列化的问题
- 有效元素序列化,提高性能
6-3 序列化中子父类构造函数问题
package com.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class ObjectSeriaDemo {
public static void main(String[] args) throws Exception {
// ObjectOutputStream oos = new ObjectOutputStream(new
// FileOutputStream("demo/obj1.dat"));
// Foo2 foo2 = new Foo2();
// oos.writeObject(foo2);
// oos.flush();
// oos.close();// 反序列化是否递归调用父类构造函数
// ObjectInputStream ois = new ObjectInputStream(new
// FileInputStream("demo/obj1.dat"));
// Foo2 foo2 = (Foo2)ois.readObject();
// System.out.println(foo2);
// ois.close();
// 输出结果:com.io.Bar1@34340fab// ObjectOutputStream oos = new ObjectOutputStream(new
// FileOutputStream("demo/obj1.dat"));
// Bar1 bar1 = new Bar1();
// oos.writeObject(bar1);
// oos.flush();
// oos.close();ObjectInputStream ois = new ObjectInputStream(new FileInputStream("demo/obj1.dat"));
Bar1 bar1 = (Bar1) ois.readObject();
System.out.println(bar1);
ois.close();
// 输出结果:bar com.io.Bar1@34340fab/*
* 对子类对象进行反序列化操作时 如果其父类没有实现序列化接口 那么其父类的构造函数会被调用
*/}
}
/*
* 一个类实现了序列化接口,其子类都可以序列化
*/
class Foo implements Serializable {
public Foo() {
System.out.println("foo……");
}
}class Foo1 extends Foo {
public Foo1() {
System.out.println("foo1……");
}
}class Foo2 extends Foo1 {
public Foo2() {
System.out.println("foo2……");
}
}class Bar {
public Bar() {
System.out.println("bar");
}
}class Bar1 extends Bar implements Serializable {
public Bar1() {
System.out.println("bar1");
}
}