1、简介
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列。该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
反序列化:从存储区中读取或反序列化对象的状态,重新创建该对象。
ObjectInputStream
主要方法
- private void writeObject(java.io.ObjectOutputStream out) throws IOException
ObjectOutputStream
主要方法
- private void readObjectNoData() throws ObjectStreamException
- private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
2、序列化的条件
- 实现java.io.Serializable接口
- 所有属性必须是可序列化的。(不可序列化时,加transient关键字,注明短暂)
eg.:
class Person implements java.io.Serializable {
public transient int SSN;//transient声明该属性不可序列化
public String name;
public int age;
public String address;
public Person(int ssn, String name, int age, String address) {
this.SSN = ssn;
this.name = name;
this.age = age;
this.address = address;
}
}
3、实例应用(序列化&反序列化)
如下的TestSerialization例子创建了一个 Person 对象,并将该对象序列化到testPerson.ser文件中,再将其反序列化打印输出。
import java.io.*;
public class TestSerialzation {
public static void main(String[] args) {
Person person1 = new Person(0, "max", 13, "china");
//开始序列化
try {
FileOutputStream fileOutputStream = new FileOutputStream("D:\\testPerson.ser");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(person1);
objectOutputStream.close();
fileOutputStream.close();
System.out.println("Serialzation is done!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//开始反序列化
System.out.println("Serialzation is start!");
Object object1 = null;
try {
FileInputStream fileInputStream = new FileInputStream("D:\\testPerson.ser");
ObjectInputStream objectIntputStream = new ObjectInputStream(fileInputStream);
object1 = (Person) objectIntputStream.readObject();
objectIntputStream.close();
fileInputStream.close();
System.out.println(((Person) object1).name + " : " + ((Person) object1).age + " : " + ((Person) object1).address);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
4、注意事项
- 当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名