概述
直接看代码
要序列化的对象
import java.io.Serializable;
/**
* 序列化就是将对象以字节流的形式输出保存到本地或网络
* 反序列化就是读取
* 只有实现了Serializable接口的类才可以序列化
*/
public class Student implements Serializable {
// private static final long serialVersionUID = 8735455341L;
private int id;
private String name;
private String sex;
transient private String school;
private Student friend;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", school='" + school + '\'' +
", friend=" + friend +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public Student getFriend() {
return friend;
}
public void setFriend(Student friend) {
this.friend = friend;
}
public Student() {
}
public Student(int id, String name, String sex, String school, Student friend) {
this.id = id;
this.name = name;
this.sex = sex;
this.school = school;
this.friend = friend;
}
}
序列化过程
import java.io.*;
public class SerializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
writeObj();
readObj();
}
/**
* 将JVM对象数据以对象形式转换成文件输出到硬盘来持久化
*/
public static void writeObj() throws IOException {
Student s= new Student(2015210890,"沈澍","男","nefu",null);
Student s2= new Student(2010000000,"张三","男","nefu",null);
s.setFriend(s2);
// s2.setFriend(s);这句一定要注释掉,不然会发生循环引用,导致栈溢出!!!
//new FileOutputStream(String destination)表明了要输出的目的地,没有的话会创建一个文件
//再用ObjectOutputStream包装的作用是:
// An ObjectOutputStream writes primitive data types and graphs of Java objects to an OutputStream.
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
oos.writeObject(s);//writeObject(Object obj)表明了jvm要序列化/持久化的对象
oos.close();
}
/**
* JVM读取文件数据并将数据转换成JVM对象
*/
public static void readObj() throws IOException, ClassNotFoundException {
ObjectInputStream ois;
ois=new ObjectInputStream(new FileInputStream("obj.txt"));
Object object=ois.readObject();//可能会出现ClassNotFoundException
Student student=(Student)object;
System.out.println("反序列化result:"+student);
}
}
结果分析
反序列化result:Student{id=2015210890, name='沈澍', sex='男', school='null', friend=Student{id=2010000000, name='张三', sex='男', school='null', friend=null}}
ObjectOutputStream是序列化JVM对象的核心,
ObjectInputStream是反序列化JVM对象的核心。
可以看到“沈澍”的friend“张三”被序列化了,说明深复制的程度很彻底。
可以看到“沈澍”和“张三”的school=‘null’,说明被transient修饰的关键字没有被序列化,所以反序列化的时候默认为Null了。