【发布时间】:2016-03-19 02:51:51
【问题描述】:
如果我想序列化一个java对象,我只需要实现标记接口Serializable,它没有任何方法。
class Employee implements Serializable{
private int id;
private String name;
/*
private void writeObject(ObjectOutputStream out) throws IOException{
System.out.println("in write object");
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
System.out.println("in read object");
}
*/
}
我的查询(编辑):
-
通过在我的代码中实现标记接口
Serializable,Java 正在序列化我的对象。哪个类负责实现Serializable接口的java对象的序列化?这个过程的入口点是什么?谁调用 ObjectOutputStream?
即使没有实现
Externalizable接口,我的类的私有方法:readObject和writeObject已被调用。这些已在上面的代码中注释以启用默认的 Java Serializaiton。为什么在没有明确实现Externalizable接口的情况下首先允许它?
编辑:为了明确我的问题,为什么 Java 允许私有 readObject & writeObject 方法而不是强制使用 Externalizable 实现来自定义序列化过程。
来自 Java 文档:
Externalizable 接口的 writeExternal 和 readExternal 方法由一个类实现,以使该类可以完全控制对象及其超类型的流的格式和内容。这些方法必须显式地与超类型协调以保存其状态。这些方法取代了 writeObject 和 readObject 方法的自定义实现。
两种机制都没有达到相同的结果吗?
【问题讨论】:
-
这可能是 Java 中最具争议的设计决策之一。 Java 序列化 API 是 Magic (TM),其所有内部结构都是 JVM 实现细节。
-
你好纪尧姆 girod-vitouchkina。即使那个问题也没有提供关于谁启动序列化过程的见解。每个人都说它自动符合条件。我的第二个问题也没有在那里得到回答。
-
@BoristheSpider 都是在对象序列化规范中定义的。没有魔法。
标签: java serialization