对象的序列化和反序列化

3.对象的序列化,反序列化
1)对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化
2)序列化流(ObjectOutputStream),是过滤流----writeObject
   反序列化流(ObjectInputStream)---readObject
3)序列化接口(Serializable)
   对象必须实现序列化接口 ,才能进行序列化,否则将出现异常
   这个接口,没有任何方法,只是一个标准
4) transient关键字---该元素不会进行jvm默认的序列化
    private void writeObject(java.io.ObjectOutputStream s)
          throws java.io.IOException
 private void readObject(java.io.ObjectInputStream s)
          throws java.io.IOException, ClassNotFoundException
         
   分析ArrayList源码中序列化和反序列化的问题
   将数组里面的有效元素进行序列化(比如数组未填满,只需要将已有的元素进行序列化)
 1 import java.io.Serializable;
 2 
 3 public class Student implements Serializable{
 4     private String stuno;
 5     private String stuname;
 6     //该元素不会进行jvm默认的序列化,也可以自己完成这个元素的序列化
 7     private transient int stuage;  
 8     
 9     public Student(String stuno, String stuname, int stuage) {
10         super();
11         this.stuno = stuno;
12         this.stuname = stuname;
13         this.stuage = stuage;
14     }
15 
16     public String getStuno() {
17         return stuno;
18     }
19     public void setStuno(String stuno) {
20         this.stuno = stuno;
21     }
22     public String getStuname() {
23         return stuname;
24     }
25     public void setStuname(String stuname) {
26         this.stuname = stuname;
27     }
28     public int getStuage() {
29         return stuage;
30     }
31     public void setStuage(int stuage) {
32         this.stuage = stuage;
33     }
34     @Override
35     public String toString() {
36         return "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage="
37                 + stuage + "]";
38     }
39      private void writeObject(java.io.ObjectOutputStream s)
40                 throws java.io.IOException{
41          s.defaultWriteObject();//把jvm能默认序列化的元素进行序列化操作
42          s.writeInt(stuage);//自己完成stuage的序列化
43      }
44      private void readObject(java.io.ObjectInputStream s)
45                 throws java.io.IOException, ClassNotFoundException{
46           s.defaultReadObject();//把jvm能默认反序列化的元素进行反序列化操作
47           this.stuage = s.readInt();//自己完成stuage的反序列化操作
48     }
49 }

测试

 1 import java.io.FileInputStream;
 2 import java.io.ObjectInputStream;
 3 
 4 public class ObjectSeriaDemo1 {
 5     public static void main(String[] args) throws Exception{
 6         String file = "demo/obj.dat";
 7         //1.对象的序列化
 8         /*ObjectOutputStream oos = new ObjectOutputStream(
 9                 new FileOutputStream(file));
10         Student stu = new Student("10001", "张三", 20);
11         oos.writeObject(stu);
12         oos.flush();
13         oos.close();*/
14         ObjectInputStream ois = new ObjectInputStream(
15                 new FileInputStream(file));
16         Student stu = (Student)ois.readObject();
17         System.out.println(stu);
18         ois.close();
19         
20     }
21     
22 
23 }

5)序列化中 子类和父类构造函数的调用问题

 1 import java.io.FileInputStream;
 2 import java.io.ObjectInputStream;
 3 import java.io.Serializable;
 4 
 5 public class ObjectSeriaDemo2 {
 6     public static void main(String[] args) throws Exception{
 7         /*ObjectOutputStream oos = new ObjectOutputStream(
 8                 new FileOutputStream("demo/obj1.dat"));
 9         Foo2 foo2 = new Foo2();
10         oos.writeObject(foo2);
11         oos.flush();
12         oos.close();*/
13         
14         //反序列化是否递归调用父类的构造函数
15         /*ObjectInputStream ois = new ObjectInputStream(
16                 new FileInputStream("demo/obj1.dat"));
17         Foo2 foo2 = (Foo2)ois.readObject();
18         System.out.println(foo2);
19         ois.close();*/
20         
21         
22         /*ObjectOutputStream oos = new ObjectOutputStream(
23                 new FileOutputStream("demo/obj1.dat"));
24         Bar2 bar2 = new Bar2();
25         oos.writeObject(bar2);
26         oos.flush();
27         oos.close();*/
28         
29         ObjectInputStream ois = new ObjectInputStream(
30                 new FileInputStream("demo/obj1.dat"));
31         Bar2 bar2 = (Bar2)ois.readObject();
32         System.out.println(bar2);
33         ois.close();
34         
35         
36         /*
37          * 对子类对象进行反序列化操作时,
38          * 如果其父类没有实现序列化接口
39          * 那么其父类的构造函数会被调用
40          */
41     }
42 }
43 /*
44  *   一个类实现了序列化接口,那么其子类都可以进行序列化
45  */
46 class Foo implements Serializable{    
47     public Foo(){
48         System.out.println("foo...");
49     }
50 }
51 class Foo1 extends Foo{
52     public Foo1(){
53         System.out.println("foo1...");
54     }
55 }
56 class Foo2 extends Foo1{
57     public Foo2(){
58         System.out.println("foo2...");
59     }
60 }
61 class Bar{
62     public Bar(){
63         System.out.println("bar");
64     }
65 }
66 class Bar1 extends Bar{
67     public Bar1(){
68         System.out.println("bar1..");
69     }
70 }
71 class Bar2 extends Bar1 implements Serializable{
72     public Bar2(){
73         System.out.println("bar2...");
74     }
75 }

 

posted @ 2019-03-28 17:35  丿Joy  阅读(234)  评论(0编辑  收藏  举报