为什么如果我不实现可序列化我仍然可以序列化一个对象?
Why if i don't implement serializable i still can serialize an object?
我读过一本书,他们说如果你不实现 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
块 e.printStackTrace()
即可查看。
(或者事件更好,根本不要将代码包装到 try-catch
,只需将方法声明更改为 public static void main(String[] args) throws IOException
。)
我读过一本书,他们说如果你不实现 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
块 e.printStackTrace()
即可查看。
(或者事件更好,根本不要将代码包装到 try-catch
,只需将方法声明更改为 public static void main(String[] args) throws IOException
。)