1)默认方法defaultWriteObject/defaultReadObject是否会进行序列化?
-不,
defaultReadObject() 调用默认的反序列化机制,在定义 readObject() 方法时使用
在您的 Serializable 类上。换句话说,当您有自定义反序列化逻辑时,
您仍然可以返回默认序列化,这将反序列化您的非静态、非瞬态字段。
例如:
public class TestClass implements Serializable {
private String f2;
private int f1;
private transient String f3;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject(); //fills f1 and f2;
fld3 = Configuration.getFooConfigValue();
}
}
另一方面,从反序列化对象外部创建 ObjectInputStream 时使用 readObject(),
并想读取之前序列化的对象:
ObojectInputStream stream = new ObjectInputStream(aStreamWithASerializedObject);
Object foo = (Foo) stream.readObject();
java.io.ObjectOutputStream.defaultWriteObject() 方法将当前类的非静态和非瞬态字段写入此流。这只能从被序列化的类的 writeObject 方法调用
此方法允许完全控制将通过线路发送的内容。
在大多数情况下,您只需调用 out.defaultWriteObject() 即可从默认序列化过程中受益。
2)仅使用实现 Serializable 的类来标记类就足以序列化一个类吗?
是的,
只要几行代码,任何其类实现 java.io.Serializable 接口的对象都可以持久化。
不需要添加额外的方法来实现接口,
然而 - 接口的目的是在运行时识别哪些类可以安全地序列化,
哪个不能。您只需将 implements 关键字添加到您的类声明中,即可将您的类标识为可序列化的。
现在,一旦类可序列化,我们就可以将对象写入任何 OutputStream,例如磁盘或套接字连接。
要实现这一点,我们必须首先创建java.io.ObjectOutputStream, 的实例
并将现有的 OutputStream 实例传递给构造函数。
/ Write to disk with FileOutputStream
FileOutputStream f_out = new
FileOutputStream("myobject.data");
// Write object with ObjectOutputStream
ObjectOutputStream obj_out = new
ObjectOutputStream (f_out);
// Write object out to disk
obj_out.writeObject ( myObject );
3)如果是,那么什么被序列化了,对象的状态在哪里被持久化?
该类的所有非瞬态非静态成员变量及其所有实现 Serializable 的基类都将以某些 media/file.object 的状态持久化到持久性存储中,并在将来需要时从保存的信息中重建对象.