79 b2 = (Blip2) in.readObject();
80 } catch (Exception e) {
81 e.printStackTrace();
82 }
83 }
84 }
Blip3.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 * 1.需要在readObject中对需要恢复的对象进行读取,否则数据都是取自默认构造器中
15 * 2.如果readObject中读取了需要的数据,那么即使默认构造器对该数据进行了改变,
16 * 也是无效的,保存什么数据,就输出什么数据,
17 * 3.如果在构造器(非默认)中某个属性未初始化,那么这个属性会赋值为0或者null序列化,
18 * 当读取数据的时候即使默认构造器对这个数据进行了初始化,也是没用的,属性的值依旧是
19 * 读取出来的0或者null
20 * @author froest
21 *
22 */
23 public class Blip3 implements Externalizable {
24 private int i;
25 private String s;
26 public Blip3(){
27 this.i = 3;
28 System.out.println("Blip3 constructor");
29 }
30 public Blip3(int i,String s){
31 System.out.println("Blip3(int ,String)");
32 this.i = i+1;
33 this.s = s;
34 }
35 public String toString(){
36 return s + " " + i;
37 }
38 public void readExternal(ObjectInput in) throws IOException,
39 ClassNotFoundException {
40 System.out.println("readExternal");
41 /**
42 * 1.如果把in.readInt()注释掉,那么程序运行时将报错java.io.OptionalDataException
43 * 而去掉注释,那么又是可以的,说明序列化后的对象属性必须按顺序读取,第一个属性取完了
44 * 才能取第二个属性,而且如果第一个属性未被读取,第二个属性也是不可以被读取的
45 * 2.如果i的值需要使用默认构造器来重新初始化,那么可以用in.readInt()来去除第一个值,但是不赋值给i
46 * 这样既可以取得序列化对象中得下一个属性值,又可以用默认构造器来重新给i赋值
47 */
48 i = in.readInt();
49 s = (String)in.readObject();
50 }
51
52 public void writeExternal(ObjectOutput out) throws IOException {
53 System.out.println("writeExternal");
54 out.writeInt(i);
55 out.writeObject(s);
56 }
57
58
59 /**
60 * @param args
61 */
62 public static void main(String[] args) {
63 System.out.println("constructor objects");
64 Blip3 blip3 = new Blip3(47,"A string");
65 System.out.println(blip3);
66 try{
67 System.out.println("save object");
68 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("Blip3.out"));
69 out.writeObject("save blip3");
70 out.writeObject(blip3);
71 out.close();
72 System.out.println("read object");
73 ObjectInputStream in = new ObjectInputStream(new FileInputStream("Blip3.out"));
74 /**
75 *String ss = (String)in.readObject();这行代码必须存在,如果我注释
76 *或者放到Blip3 b = (Blip3)in.readObject();之后,那么都将报错,由此可以判断
77 *序列化到文件是有顺序的,必须什么顺序存入,就什么顺序取出,如果之前那个不取出,
78 *下一个也不能被取出
79 */
80 String ss = (String)in.readObject();
81 Blip3 b = (Blip3)in.readObject();
82