java基础-Serializable

 

 

 1     @Test
 2     public void testSerializable() throws IOException, ClassNotFoundException {
 3         Son son = new Son();
 4         son.changeFieldValue();
 5         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
 6         ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
 7         objectOutputStream.writeObject(son);
 8         Son.staticField = 3;
 9         ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
10         son = (Son) objectInputStream.readObject();
11         /**
12          * 输出:
13          * parent
14          * son
15          * parent
16          * Son{staticField=3, s=2, transientField=0, p=1}
17          */
18         System.out.println(son);
19     }
20     private static class Son extends Parent implements Serializable{
21         //正常序列化
22         private int s = 1;
23         //类字段不会参与序列化
24         private static int staticField = 1;
25         //transient字段不会参与序列化
26         private transient int transientField = 1;
27         //由于子类实现了Serializable,故会序列化子类字段,反序列化时不会使用声明的构造器初始化,
28         // 而是使用jvm反射特性直接实例化一个空对象,然后进行赋值,故子类的构造器可以不存在公开、无参构造器。
29         private Son() {
30             System.out.println("son");
31         }
32         private void changeFieldValue() {
33             this.s = 2;
34             Son.staticField = 2;
35             this.transientField = 2;
36             this.p = 2;
37         }
38 
39         @Override
40         public String toString() {
41             return "Son{" +
42                     "staticField=" + staticField +
43                     ", s=" + s +
44                     ", transientField=" + transientField +
45                     ", p=" + p +
46                     '}';
47         }
48     }
49     private static class Parent{
50         //没有实现Serializable的类,字段不会参与序列化
51         protected int p = 1;
52         //由于Parent没有实现Serializable,所以这里的字段不会序列化,
53         //当反序列化子类时,由于没有序列化父类,故需要调用父类的构造器来初始化父类,
54         //父类必须有一个公开、无参的构造函数。
55         public Parent() {
56             System.out.println("parent");
57         }
58     }

 

posted @ 2017-10-06 20:37  holoyong  阅读(187)  评论(0编辑  收藏  举报