我正在尝试了解java序列化机制,我几乎没有疑问
请回答以下有关 java 序列化的问题:
- 我们为什么使用
oos.defaultWriteObject();
? 根据这篇文章,它在那里是为了向后兼容。而且我不太明白它是如何实现的。序列化的不兼容更改之一是删除较新版本中的字段。这意味着旧版本必须设置有时对用户无效的默认值。这与添加新字段并允许设置默认值的新版本有何不同? - 在自定义序列化期间,同时使用两者是否有任何区别,
oos.defaultWriteObject();
两者oos.writeObject(address);
是否做同样的事情?我的意思是两者都将所有超类和当前类的非瞬态非静态字段写入OOS。
这里
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException {
stream.writeObject(name);
stream.writeInt(id);
stream.writeObject(DOB);
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
name = (String) stream.readObject();
id = stream.readInt();
DOB = (String) stream.readObject();
}
上面的代码产生与下面的代码相同的结果
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException {
stream.defaultWriteObject();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
}
什么时候使用这两种方法,什么时候只使用 writeObject(employee); //员工是我的全部对象//
- 这是无法回答我的问题的可能重复问题的列表。
- 问题 1它说 * 如果在写入可选数据(如果有)之前未调用一次 defaultWriteObject 或 writeFields,那么在 ObjectInputStream* 但我仍然可以在不使用 deafultwriteobject.right 的情况下调用 writeObject 的情况下,实例反序列化的行为是未定义的?
- 问题 2这些答案说 defaultwriteobject 方法将一些额外的数据写入流,并反射性地检查要写入的内容。oos.writeobject(object obj) 不也反射性地检查吗?
- 最后我可以通过重写 writeObject 和 ReadObject 方法来控制我的序列化,那么 Externalizable 有什么意义呢?
- 如果提供串行 versionUID 不会引发异常,如果我反序列化具有该字段的旧类中缺少字段的对象会发生什么,基本上,如果我提供自己的 SerialverUID,所有不兼容的更改会发生什么?它是否拥有自己的串行版本 UID 不会为所有兼容更改引发流损坏异常?