Java-Basic-5-序列化

序列化

序列化:一般等价于持久化,将对象转换为字节流存储在磁盘上、网络上、内存里。

通过实现 标记接口 java.io.Serializable

如果类中的一个变量不想被序列化,可以将其标记为短暂变量,使用 transient。静态变量是属于类的,而不是属于对象的,所以不会被序列化。

一般将序列化输出的文件名命名为 <name>.ser

一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// 首先定义一个可序列化的类
// Employee.java 文件
public class Employee implements java.io.Serializable
{
public String name;
public String address;
public transient int SSN; // 这个值是短暂的,不会被序列化存储,不会被发送到输出流,所以在反序列化时直接被初始化为0
public int number;
public void mailCheck()
{
System.out.println("Mailing a check to " + name
+ " " + address);
}
}

// 序列化这个类
// SerializeDemo.java 文件
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("/tmp/employee.ser"); // 指定输出文件流
ObjectOutputStream out = new ObjectOutputStream(fileOut); // 高层次的数据输出流
out.writeObject(e); // 序列化对象并 发送到输出流
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /tmp/employee.ser");
}catch(IOException i)
{
i.printStackTrace();
}
}
}


// 实现反序列化
// DeserializeDemo.java 文件

import java.io.*;

public class DeserializeDemo
{
public static void main(String [] args)
{
Employee e = null;
try
{
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); // 输入文件流
ObjectInputStream in = new ObjectInputStream(fileIn); // 高层次的数据输入流
e = (Employee) in.readObject(); // 反序列化对象并发送到输入流
in.close();
fileIn.close();
}catch(IOException i)
{
i.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);
}
}

注意到其中我们用到了 :

1
2
3
4
5
public final void writeObject(Object x) throws IOException
// 用于序列化一个对象,并将其发送到输出流
public final Object readObject() throws IOException,
ClassNotFoundException
// 用于反序列化一个对象并发送到输入流

另外 ClassNotFoundException 异常:若JVM反序列化过程中,找不到该类的字节码,会抛出这个异常。