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