15 Alien alien1 = (Alien)in.readObject();
16 //System.out.println("alien = "+alien1);
17 System.out.println("alien = "+alien1.getClass().toString());
18 }
19 }
3.除了用Serializable实现序列化,还可以用Externalizable来实现实现序列化不会调,但是有一点区别:Serializable用默认的构造器,而Externalizable实现序列化会调用默认的构造器。
如果是用实现Serializable接口的序列化,那么如果不对属性做处理的话,所有的属性都会被保存下来,如果有敏感的信息不希望被保存的话,可以使用transient关键字,这样保存序列化对象的时候就不会把这个属性的状态信息保存起来了;另外如果这个属性字段用了transient关键字,而特殊情况下又需要保存这个属性的状态信息,那么可以在需要序列化的类中添加私有的writeObject()和readObject()方法即可。
如果用实现Externalizable接口的序列化,那么可以控制哪些字段做保存,不需要使用transient关键字,但是需要在需要实现序列化的类中添加readExternal()和writeExternal()方法来实现
下面看下我写的一些例子,在程序里面有时碰到问题就会去验证,所以加上了一些说明性文字:
Blip1.java
show sourceview sourceprint 01 package froest.serializable.externalizable;
02
03 import java.io.Externalizable;
04 import java.io.FileInputStream;
05 import java.io.FileOutputStream;
06 import java.io.IOException;
07 import java.io.ObjectInput;
08 import java.io.ObjectInputStream;
09 import java.io.ObjectOutput;
10 import java.io.ObjectOutputStream;
11
12 /**
13 * 此例说明了实现Externalizable方法后,当恢复对象的时候会调用相应类的构造器,所以如果在构造器中没有初始化,
14 * 那么会得到0或者null
15 * @author froest
16 *
17 */
18 class Blip1 implements Externalizable {
19 private int i;
20
21 public Blip1() {
22 System.out.println("Blip1 constructor");
23 }
24
25 public void readExternal(ObjectInput in) throws IOException,
26 ClassNotFoundException {
27 System.out.println("Blip1.readExternal");
28 }
29
30 public void writeExternal(ObjectOutput out) throws IOException {
31 System.out.println("Blip1.writeExternal");
32 }
33
34 public void setI(int i) {
35 this.i = i;
36 }
37
38 public int get() {
39 return i;
40 }
41 }
42
43 class Blip2 implements Externalizable {
44
45 public Blip2() {
46 System.out.println("Blip2.constructor");
47 }
48
49 public void readExternal(ObjectInput in) throws IOException,
50 ClassNotFoundException {
51 System.out.println("Blip2.readExternal");
52 }
53
54 public void writeExternal(ObjectOutput out) throws IOException {
55 System.out.println("Blip2.writeExternal");
56 }
57 }
58
59 public class Blips {
60 public static void main(String[] args) {
61 System.out.println("constructor Object");
62 Blip1 b1 = new Blip1();
63 b1.setI(100);
64 Blip2 b2 = new Blip2();
65 try {
66 ObjectOutputStream out = new ObjectOutputStream(
67 new FileOutputStream("Blip.x"));
68 System.out.println("saving object");
69 out.writeObject(b1);
70 out.writeObject(b2);
71 out.close();
72 ObjectInputStream in = new ObjectInputStream(new FileInputStream(
73 "Blip.x"));
74 System.out.println("getting object");
75 System.out.println("recovering b1");
76 b1 = (Blip1) in.readObject();
77 System.out.println(b1.get());
78