java - 为什么如果我不实现可序列化我仍然可以序列化一个对象?

标签 java serializable

我读过一本书,他们说如果你不实现 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 倍。那么为什么我可以序列化一些没有实现可序列化的东西,为什么如果我实现它文件会变短?

最佳答案

ObjectOutputStream.writeObject 方法接受类型为Object 的参数,而不是Serializable。这就是编译器不会提示并编译程序的原因。

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

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

关于java - 为什么如果我不实现可序列化我仍然可以序列化一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462948/

相关文章:

java - Spring Boot 中的预定作业

上传文件时出现java.lang.NoSuchMethodError

java - 针对不可序列化对象和函数的 Spark Scala 编程

Java 对象流和 java.io.EOFException

c# - T 类型的泛型,其中 T 具有特定属性

java - 用于 XML 解析的 JAXB 替代方案

Java泛型方法,通配符List返回类型

java - 何时使用静态方法

java - GUI 反序列化期间 Swing 触发监听器

java - (objectinputstream) ObjectInput.readObject() 给我一个空对象