java序列化(四)

2014-11-24 03:07:53 · 作者: · 浏览: 2
System.out.println("recovering b2");

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