【问题标题】:Serialization of a class which doesnt implement Serializable不实现 Serializable 的类的序列化
【发布时间】:2012-02-17 09:47:17
【问题描述】:

我有 2 个类 serial1 和 serial 2。serial1 实现 Serializable 而 serial2 没有。根据理论,我应该得到以下代码的异常,但它工作正常。为什么会这样?

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 + 大都会

serial2 + met1

系列 1 + 大都会

serial2 + met1

【问题讨论】:

  • 您认为在哪里/为什么应该有例外?
  • 附带说明:您可能不需要将所有内容分成自己的 try/catch 块。如果创建fos 抛出FileNotFoundException,你真的还想尝试创建oos吗?

标签: java serializable


【解决方案1】:

您实际上并没有序列化serial2。您的 mets 方法会创建一个局部变量,但一旦该方法返回,它就会超出范围并有资格进行垃圾回收。

如果你在serial1 中有一个serial2 类型的实例变量,那么当你尝试序列化时你会看到一个异常(假设它是一个非空值),但一个局部变量不会有问题。

【讨论】:

    【解决方案2】:

    我没有看到你序列化serial2

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 1970-01-01
      • 2011-05-28
      • 2016-02-04
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      相关资源
      最近更新 更多