java序列化(五)

2014-11-24 03:07:53 · 作者: · 浏览: 9
System.out.println(ss);

83 System.out.println(b);

84 }catch(Exception e){

85 e.printStackTrace();

86 }

87 }

88 }

SerialCtr.java

show sourceview sourceprint 01 package froest.serializable;

02

03 import java.io.FileInputStream;

04 import java.io.FileOutputStream;

05 import java.io.IOException;

06 import java.io.ObjectInputStream;

07 import java.io.ObjectOutputStream;

08 import java.io.Serializable;

09

10

11 public class SerialCtr implements Serializable {

12 private static final long serialVersionUID = 5442274055003105383L;

13 private String name;

14 private transient String password;

15 public SerialCtr(String a,String b){

16 this.name = a;

17 this.password = b;

18 }

19 public String toString(){

20 return "Not transient : " + name +

21 "\n transient : " + password;

22 }

23 private void writeObject(ObjectOutputStream out) throws IOException{

24 /**

25 * 1.如果对象实现Serializable,但是又在自己的对象中定义了writeObject()和readObject()方法

26 * 那么编译器就会放弃Serializable接口的默认的序列化机制,但是可以在对象的writeObject()和readObject()中

27 * 调用out.defaultWriteObject()和in.defaultReadObject()方法来开启默认的序列化机制;如果对于transient字段

28 * 我们可以调用对象的writeObject()和readObject()方法来序列化,这就实现了transient属性不能序列化的缺点,因为

29 * 有的时候需要让transient属性页得到序列化

30 * 2.在这里的readObject()方法可以只取出一个属性,因为这是在序列化对象的内部,而序列化对象的外部是

31 * 把这整个序列化对象取出来,所以这里与顺序和取多少个属性无关(其他例子有说到顺序的问题,这是一点区别)

32 */

33 out.defaultWriteObject();

34 out.writeObject(password);

35 }

36 private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException{

37 in.defaultReadObject();

38 password = (String)in.readObject();

39 }

40

41

42 /**

43 * @param args

44 */

45 public static void main(String[] args) {

46 SerialCtr s = new SerialCtr("LH","1qaz");

47 System.out.println("Before Serial: \n" + s);

48 //ByteArrayOutputStream buf = new ByteArrayOutputStream();

49 try{

50 //ObjectOutputStream out = new ObjectOutputStream(buf);

51 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("SerialExternal.out"));

52 out.writeObject(s);

53 out.close();

54 //ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));

55 ObjectInputStream in = new ObjectInputStream(new FileInputStream("SerialExternal.out"));

56 SerialCtr s1 = (SerialCtr)in.readObject();

57 System.out.println("After Serial: \n" + s1);

58 }catch(Exception e){

59 e.printStackTrace();

60 }

61 }

62 }

4.若果一个类A中有类B和类C的引用,而类B中有类D的数组的引用,类C中有类E的引用,那么序列化机制是否可以正确的还原呢?

还是看下书上的例子吧:

show sourceview sourceprint 01 package froest.serializable;

02

03 import java.io.ByteArrayInputStream;

04 import java.io.ByteArrayOutputStream;

05 import java.io.ObjectInputStream;

06 import java.io.ObjectOutputStream;

07 import java.io.Serializable;

08 import java.util.Vect