为什么如果我不实现可序列化,我仍然可以序列化对象?



我读过一本书,书中说如果不实现Serializable,就不能序列化给定的对象。但我在没有实现的情况下尝试了它,它很有效。这里有一些代码:

import java.io.*;
class SerializerTest {
    private int a;
    private int b;
    public SerializerTest(int a, int b) {
        this.a = a;
        this.b = b;
    }
    public static void main(String[] args) {
        try {
            SerializerTest st = new SerializerTest(10, 20);
            FileOutputStream fs = new FileOutputStream("st.ser");
            ObjectOutputStream os = new ObjectOutputStream(fs);
            os.writeObject(st);
        } catch (Exception e) {}
    }
}

但我注意到,如果实现Serializable,st.ser文件会变小10倍。那么,为什么我可以序列化不实现Serializable的东西,为什么如果我实现了它,文件会变短呢?

方法ObjectOutputStream.writeObject接受类型为Object的参数,而不是Serializable。这就是为什么编译器不会抱怨,而是编译程序。

但是,在运行时,方法writeObject失败并抛出一个NotSerializableException。在程序中,会捕获并忽略异常。只需尝试添加到catche.printStackTrace()即可查看。

(或者事件更好,根本不要将代码包装为try-catch,只需将方法声明更改为public static void main(String[] args) throws IOException即可。)

最新更新