Java提供了一种对象序列化的机制,即一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据和对象中的数据类型可以用来在内存中新建对象。
序列化的整个过程都是在Java虚拟机(JVM)中独立的,即在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
public final void writeObject(Object x) throws IOException |
ObjectOutputStream类包含的该方法序列化一个对象,并将它送到输出流。
public final Object readObject() throws IOException, ClassNotFoundException |
相似的,ObjectInputStream类包含的该方法从流中取出一个对象,并将该对象反序列化。它的返回值为Object,因此需要将它转换成合适的数据类型。
下面将通过一个例子来演示序列化在Java中是怎样工作的,首先定义Employee类,该类实现了Serializable接口。
public
class
Employee
implements java.io.
Serializable {
public
String
name;
public
String
address;
public
transient
int
SSN;
public
int
number;
public
void
mailCheck()
{
System.
out.
println(
"Mailing a check to " + name
+
" " + address);
}
}
|
接着,将在主程序中实例化一个Employee对象,并将该对象序列化到一个文件中。该程序执行后,就创建了一个名为employee.ser文件。
import java.io.*;
public
class
SerializeDemo {
public
static
void
main(
String[]
args) {
Employee
e =
new
Employee();
e.
name =
"Reyan Ali";
e.
address =
"Phokka Kuan, Ambehta Peer";
e.
SSN =
11122333;
e.
number =
101;
try {
FileOutputStream
fileOut =
new
FileOutputStream(
"F://java/employee.ser");
ObjectOutputStream
out =
new
ObjectOutputStream(fileOut);
out.
writeObject(e);
out.
close();
fileOut.
close();
System.
out.
println(
"Serialized data is saved in F://java/employee.ser");
}
catch (
Exception
exception) {
exception.
printStackTrace();
}
}
}
|
下面的程序实例了反序列化,F://java/employee.ser储存了该对象。
import java.io.*;
public
class
DeserializeDemo {
public
static
void
main(
String[]
args) {
Employee
e =
null;
try {
FileInputStream
fileIn =
new
FileInputStream(
"F://java/employee.ser");
ObjectInputStream
in =
new
ObjectInputStream(fileIn);
e = (Employee)
in.
readObject();
in.
close();
fileIn.
close();
}
catch (
Exception
exception) {
//TODO: handle exception
}
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);
}
}
|
以上程序编译运行结果如下: