(目录)
一、说明
序列化与反序列化是什么
-
序列化:将Java对象表示为一个字节序列,存储对象数据到文件中,可用于网络传输
-
反序列化:从文件中读取序列化对象,对它进行反序列化,恢复成Java对象
二、理解
序列化过程
- 整个过程是JVM独立的,序列化的对象可以在不同的平台上反序列化该对象
- 对象序列化,类必须实现
Serializable
接口 - 该类的所有属性必须是可序列化的,如果有一个属性不是可序列化的,则该属性必须注明是短暂的
- 使用IO流中的对象流实现序列化操作,将对象保存到文件,再读取出来
- 当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名
序列化作用
- 对象转化为二进制,可用于网络传输
- 把内存中的对象保存到一个文件中或者数据库中
三、实现
1.实现接口
创建一个Student
类,实现Serializable
接口
public class Student implements java.io.Serializable {
public String name;
public String classes;
public transient int SSN;
public int number;
public void checkInfo() {
System.out.println("Student Info " + name
+ " " + classes);
}
}
2.序列化方法
用ObjectOutputStream
类 .writeObject()
方法
FileOutputStream fileOut = new FileOutputStream("file\\student.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(s);
out.close();
fileOut.close();
public class SerializeDemo {
public static void main(String [] args){
Student s = new Student();
s.number = 17;
s.name = "Good";
s.classes = "computer_1";
s.SSN = 233;
try {
FileOutputStream fileOut =
new FileOutputStream("file\\student.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(s);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in file/student.ser");
}catch(IOException i) {
i.printStackTrace();
}
}
}
3.反序列化方法
用ObjectInputStream
类 .readObject()方法
FileInputStream fileIn = new FileInputStream("file\\student.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
s= (Student) in.readObject();
in.close();
fileIn.close();
public class DeserializeDemo {
public static void main(String [] args) {
Student s = null;
try {
FileInputStream fileIn = new FileInputStream("file\\student.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
s= (Student) in.readObject();
in.close();
fileIn.close();
}catch(IOException i) {
i.printStackTrace();
return;
}catch(ClassNotFoundException c) {
System.out.println("Student class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Student");
System.out.println("Name: " + s.name);
System.out.println("Address: " + s.classes);
//SSN属性是短暂的,该值没有被发送到输出流,反序列化后属性为 0
System.out.println("SSN: " + s.SSN);
System.out.println("Number: " + s.number);
}
}