一、说明
序列化与反序列化是什么
- 序列化:将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); } }