如果我想序列化一个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正在序列化my对象。哪个类负责实现Serializable接口的java对象的序列化?
这个过程的切入点是什么?谁给ObjectOutputStream打电话?Externalizable接口,也会调用我类的私有方法:readObject和writeObject。在上面的代码中已经对它们进行了注释,以启用默认的Java序列化。为什么在不显式实现Externalizable接口的情况下允许使用它?编辑:为了明确我的问题,为什么Java允许私有readObject & writeObject方法而不是强制使用Externalizable实现来定制序列化过程。
来自Java文档:
可扩展接口的writeExternal和readExternal方法由类实现,以使类完全控制对象及其超级类型的流的格式和内容。这些方法必须显式地与父类型协调以保存其状态。这些方法取代了writeObject和readObject方法的自定义实现。
两种机制都不能实现相同的结果?
发布于 2015-12-13 19:28:41
哪个类启动序列化过程?
java.io.ObjectOutputStream.
Serializable,Java正在序列化my对象。哪个类负责实现Serializable接口的java对象的序列化?java.io.ObjectOutputStream,又来了。你好像在找不存在的神奇的东西。
Externalizable接口,也会调用我类的私有方法:readObject和writeObject。在上面的代码中已经对它们进行了注释,以启用默认的Java序列化。为什么在不显式实现Externalizable接口的情况下允许使用它?您命名的方法与Externalizable接口无关,后者包含两个完全不同的方法。您的问题的答案很简单,就是这样设计的,以便允许某种程度的自定义序列化,而不需要Externalizable接口,并且它是通过反射实现的。
为什么Java允许私有
readObject & writeObject方法而不是强迫使用Externalizable实现来定制序列化过程。
它们是不相等的,所以这个问题没有意义。在Serializable级别,Java提供了自动处理本地和父级非瞬态状态的功能,而在Externalizable中,您必须完全自己处理。
这两种机制不是取得了相同的结果吗?
不是的。
发布于 2015-12-13 16:39:41
负责序列化对象的类是java.io.ObjectOutputStream。反序列化是在java.io.ObjectInputStream类中完成的。
类JavaDoc ObjectOutputStream也包含以下内容:
在序列化和反序列化过程中需要特殊处理的类必须实现具有以下确切签名的特殊方法: 私有空readObject(java.io.ObjectInputStream流)抛出IOException,ClassNotFoundException;私有虚writeObject(java.io.ObjectOutputStream流)抛IOException;私有空readObjectNoData()抛出ObjectStreamException;
下面是一些伪代码,它展示了ObjectOutputStream的工作原理。我省略了许多细节,部分工作是用ObjectStreamClass完成的。
class ObjectOutputStream {
writeObject(obj) {
writeObject0(obj);
}
writeObject0(obj) {
if (hasWriteReplaceMethod(obj)) {
obj = obj.writeReplace();
}
writeOrdinaryObject(obj);
}
writeOrdinaryObject(obj) {
if (isExternalizable(obj)) {
writeExternalData(obj);
} else {
writeSerialdata(obj);
}
}
writeExternalData(obj) {
obj.writeExternal(this);
}
writeSerialData(obj) {
if hasWriteObjectMethod(obj)
obj.writeObject(this);
else
defaultWriteFields(obj);
}
}https://stackoverflow.com/questions/34253236
复制相似问题