一、简介
序列化概念:Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
**序列化作用:**在传递和保存对象时,保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
**反序列化作用:**根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。
类 ObjectOutputStream的方法writeObject(Object x)用以序列化一个对象,并将它发送到输出流。
public final void writeObject(Object x) throws IOException
类 ObjectInputStream的方法readObject()用以反序列化一个对象,该方法从流中取出下一个对象,并且将对象放序列化,它的返回值为Object,因此你需要将它转换成合适的数据类型。
public final Object readObject() throws IOException,ClassNotFoundException
二、序列化示例
定义一个序列化的类,并且要实现Serializable接口
package com.jp.javaSE.序列化.序列化对象;
import java.io.Serializable;
/**
* @program: mianjing
* @description:
* @author:
* @create: 2020-10-31 19:35
**/
public class Employee implements Serializable {
public String name;
public String address;
public transitransient int SSN;
public int number;
public void mailCheck(){
System.out.println("Mailing a check to"+name+" "+address);
}
}
序列化方法
package com.jp.javaSE.序列化.序列化对象;
import java.io.ObjectOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* @program: mianjing
* @description: 序列化对象
* @author:
* @create: 2020-10-31 19:40
**/
public class SerializeDemo {
public static void main(String[] args) {
Employee e= new Employee();
e.name="Reyan Ali";
e.address="Phokka Kuan,Ambehtart Peer";
e.SSN=11122333;
e.number=10781;
try {
//该类用来创建一个文件并向文件中写数据。
//如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
FileOutputStream fileOut= new FileOutputStream("C:/2020_study/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.println("Serialized data is saved in /2020_study/employee.ser");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
三、序列化示例
注意:由于属性SSN的值为111222333,它是被transitransient修饰的,因此该值没有被发送到输出流,所以反序列化后Employee对象的SSN属性输出为0。
package com.jp.javaSE.序列化.反序列化对象;
import com.jp.javaSE.序列化.序列化对象.Employee;
import java.io.*;
/**
* @program: mianjing
* @description:
* @author:
* @create: 2020-10-31 19:59
**/
public class DeserializeDemo {
public static void main(String[] args) {
Employee e=null;
try{
FileInputStream fileIn= new FileInputStream("C:/2020_study/employeee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
//
e=(Employee)in.readObject();
in.close();
fileIn.close();
} catch (IOException ex) {
ex.printStackTrace();
return;
}catch (ClassNotFoundException c) {
System.out.println("Employee class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Employee...");
System.out.println("Name:"+e.name);
System.out.println("Address:"+e.address);
System.out.println("SSN:"+e.SSN);
System.out.println("Number:"+e.number);
}
}
结果输出: