2012-01-24 3 views
0

У меня есть 2 класса serial1 и serial 2. serial1 реализует Serializable, а serial2 - нет. Согласно теории, я должен получить исключение для следующего кода, но он работает нормально. почему это так ?Сериализация класса, который не реализует Serializable

import java.io.*; 

public class SerialTest { 

    public static void main(String args[]){ 
     FileOutputStream fos=null; 
     ObjectOutputStream oos =null; 
     serial1 se = new serial1(); 
     serial1 sd = null; 
     se.mets(); 
     try { 
      fos= new FileOutputStream("serialtest"); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      oos =new ObjectOutputStream(fos); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      oos.writeObject(se); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     FileInputStream fis=null; 
     ObjectInputStream ois = null; 

     try { 
      fis = new FileInputStream("serialtest"); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      ois = new ObjectInputStream(fis); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      sd = (serial1) ois.readObject(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     sd.mets(); 

    } 

} 


import java.io.Serializable; 

public class serial1 implements Serializable{ 

    /* public static void main(String []args){  
     serial1 ss = new serial1(); 
     ss.mets(); 
    }*/ 

    public void mets(){ 
     serial2 s2 = new serial2(); 
     System.out.println("serial 1 + mets"); 
     s2.met1(); 
    } 
} 


public class serial2 { 

    public void met1(){ 
     System.out.println("serial2 + met1"); 
    } 

} 

--------------------------- * Выход

серийные 1 + Mets

SERIAL2 + MET1

серийными 1 + Mets

Serial2 + Met1

+1

Где/почему, по-вашему, у вас должно быть исключение? –

+1

В качестве побочного примечания: вам, вероятно, не нужно разделить все на свой собственный блок try/catch. Если при создании 'fos' вызывается' FileNotFoundException', вы действительно хотите по-прежнему пытаться сделать 'oos'? – Jeffrey

ответ

3

Вы фактически не сериализуете serial2. Ваш метод mets создает локальную переменную, но как только метод возвращает ее, она выходит за пределы области видимости и становится пригодной для сбора мусора.

Если у вас была переменная экземпляра типа serial2 внутри serial1, тогда при попытке сериализации вы увидите исключение (при условии, что это ненулевое значение), но локальная переменная не будет проблемой.

3

Я не вижу, что вы когда-либо сериализации serial2

Смежные вопросы