Java 序列化
内容纲要
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。
ObjectOutputStream 类包含很多写方法来写各种数据类型,但是一个特别的方法例外:
public final void writeObject(Object x) throws IOException
上面的方法序列化一个对象,并将它发送到输出流。相似的 ObjectInputStream 类包含如下反序列化一个对象的方法:
public final Object readObject() throws IOException, ClassNotFoundException
该方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,你需要将它转换成合适的数据类型。
为了演示序列化在Java中是怎样工作的,我将使用之前教程中提到的Employee类,假设我们定义了如下的Employee类,该类实现了Serializable 接口。
//Employee.java
package Serializable;
class Employee implements java.io.Serializable {
String name;
int age;
String sex;
int income;
}
//SerializableIn.java
package Serializable;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializableIn {
public static void main(String[] args) {
Employee employee = new Employee();
employee.name="wk";
employee.age=19;
employee.income=0;
employee.sex="male";
try {
FileOutputStream fileOut=new FileOutputStream("C:\\Users\\Davidlee\\Desktop\\java\\new\\src\\main\\java\\Serializable\\tmp\\e.ser");
ObjectOutputStream out=new ObjectOutputStream(fileOut);
out.writeObject(employee);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /tmp/e.ser");
} catch (IOException e) {
e.printStackTrace();
}
}
}
//SerializableOut.java
package Serializable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
public class SerializableOut {
public static void main(String[] args) {
Employee e=null;
try {
FileInputStream fileIn = new FileInputStream("C:\\Users\\Davidlee\\Desktop\\java\\new\\src\\main\\java\\Serializable\\tmp\\e.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e=(Employee)in.readObject();
in.close();
fileIn.close();
} catch (IOException e1) {
e1.printStackTrace();
return;
}catch (ClassNotFoundException e2){
e2.printStackTrace();
return;
}
System.out.println(e.sex+" "+e.income+" "+e.age+" "+e.name);
}
}