import java.io.*;
class Food {Food(){System.out.println("1");}}class Fruit extends Food implements Serializable{
Fruit(){System.out.println("2");}}
 public class Banana2 extends Fruit{
int size=42;
public static void main(String []args){Banana2 b=new Banana2();
   b.serializeBanana2(b);
b=b.deserialazeBanana2(b);
System.out.println("restored"+b.size+" ");
   }
 }}
What is the result? 
 
A. Compilation fails 
B. 1 restored 42 
C. 12 restored 42 
D. 121 restored 42 
E. 1212 restored 42 
F. An exception is thrown at runtime
Answer: ( D )
因为父类Food未实现serializable接口,反序列化时将调用Food的构造函数
参考大纲:IO操作 — 序列化机制不明白请高手讲解

解决方案 »

  1.   

     b.serializeBanana2(b);
    b=b.deserialazeBanana2(b);
    这是什么方法?
      

  2.   


    import java.io.*;
    class Food {
    Food(){
            System.out.println("1");
        }
    }class Fruit extends Food implements Serializable{
    Fruit(){
            System.out.println("2");
        }
    }
    public class Banana2 extends Fruit{
        int size=42;
        public static void main(String []args){
            Banana2 b=new Banana2();//1
            /**
              * 1.此处可以从类加载顺序的先后解决,JVM加载一个类的时候,
              *   首先类加载器会查看该类有没有父类,如果有的话,那么先加载父类
              *   所以这里的加载顺序就是Food-->Fruit-->Banana2
              *   打印出12
              */
            b.serializeBanana2(b);//2
            /**
              * 2.这里在晃点你,b序列化完之后还是b,因为它没有子类
              */
            b=b.deserialazeBanana2(b);//3
            /**
              * 3.这里是反序列化,楼上说的很对,
              *   如果父类不可以序列化,但是子类可以序列化
              *   那么,反序列化子类对象的时候
              *   首先要通过调用父类的无参的构造函数先构造出一个父类对象
              *   所以反序列化b的时候,它会查看它的直接父类Fruit是否可以被序列化,
              *   如果不可以,那么加载Fruit对象,
              *   如果可以,并且有父类的时候,反序列化到其父类,
              *   如果没有父类,什么都不执行,那么最后Food类不可以被序列化,
              *   加载Food对象,这里打印出1,最后一句就不用说了
              */
            System.out.println("restored"+b.size+" ");
        }
    }
    希望对你有帮助!
      

  3.   

    建议好好看看scjp中关于序列化与反序列化的内容,结合代码练习。以上讲很好,很清楚。但如刚学习序列化的内容,可能还是有点晕。