Java 在不提供writeObject/readObject方法的情况下实现Serializable
如果一个类正在实现可序列化接口,但代码库中的任何地方都没有Java 在不提供writeObject/readObject方法的情况下实现Serializable,java,serializable,Java,Serializable,如果一个类正在实现可序列化接口,但代码库中的任何地方都没有writeObject/readObject方法实现,该怎么办 默认方法defaultWriteObject/defaultReadObject是否进行序列化 仅将类标记为实现可序列化是否足以序列化类 如果是,那么什么被序列化,对象的状态在哪里被持久化? 这也是一个很好的参考文件,可以帮助你理解你所要求的要点,这篇文件的一个片段可以帮助你更好地理解它 writeObject方法负责为其特定类写入对象的状态,以便相应的readObject方
writeObject/readObject
方法实现,该怎么办
默认方法defaultWriteObject/defaultReadObject
是否进行序列化
仅将类标记为实现可序列化
是否足以序列化类
如果是,那么什么被序列化,对象的状态在哪里被持久化?
这也是一个很好的参考文件,可以帮助你理解你所要求的要点,这篇文件的一个片段可以帮助你更好地理解它
writeObject方法负责为其特定类写入对象的状态,以便相应的readObject方法可以还原它。保存对象字段的默认机制可以通过调用out.defaultWriteObject来调用。该方法不需要关心属于其超类或子类的状态。通过使用writeObject方法或使用DataOutput支持的基本数据类型的方法将各个字段写入ObjectOutputStream来保存状态
readObject方法负责从流中读取并恢复类字段。它可以调用in.defaultReadObject来调用用于恢复对象的非静态和非瞬态字段的默认机制。defaultReadObject方法使用流中的信息将保存在流中的对象的字段与当前对象中相应命名的字段一起分配。这将处理类进化为添加新字段的情况。该方法不需要关心属于其超类或子类的状态。通过使用writeObject方法或使用DataOutput支持的基本数据类型的方法将各个字段写入ObjectOutputStream来保存状态
如果序列化流没有将给定类列为反序列化对象的超类,ReadObjectNodeData方法负责初始化其特定类的对象状态。当接收方使用与发送方不同的反序列化实例类版本,并且接收方版本扩展了未由发送方版本扩展的类时,可能会发生这种情况。如果序列化流被篡改,也可能发生这种情况;因此,ReadObjectNodeData对于正确初始化反序列化对象非常有用,尽管源流“恶意”或不完整
如果一个类正在实现可序列化接口,但代码库中的任何地方都没有writeObject/readObject
方法实现,该怎么办
它将接受默认序列化:请参见下文
默认方法defaultWriteObject/defaultReadObject
是否进行序列化
不,因为除非你调用它们,否则它们不会被调用
仅将类标记为实现可序列化
是否足以序列化类
是的,如果您对默认序列化感到满意:请参见下文
如果是,那么什么是序列化的
类及其所有基类的所有非瞬态非静态成员变量,这些变量实现了Serializable、
等功能
对象持久化的状态在哪里
进入小溪。您问题的这一部分似乎没有意义,1)默认方法defaultWriteObject/defaultReadObject是否会进行序列化?
-不,
defaultReadObject()调用默认的反序列化机制,并在定义readObject()方法时使用
在可序列化类上。换句话说,当您有自定义反序列化逻辑时,
您仍然可以返回默认序列化,它将反序列化非静态、非瞬态字段。
例如:
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方法调用
此方法允许完全控制通过导线发送的内容。
在大多数情况下,您只需调用.defaultWriteObject()即可从默认序列化过程中获益
2)是否仅使用可序列化的工具来标记类,以序列化类?
对
任何类实现java.io.Serializable接口的对象都可以通过几行代码持久化。
不需要添加额外的方法来实现接口,
但是-接口的目的是在运行时确定哪些类可以安全序列化,
这是不可能的。只需将implements关键字添加到类声明中,即可将类标识为可序列化的
现在,一旦类可序列化,我们就可以将对象写入任何输出流,例如磁盘或套接字连接。
为了实现这一点,我们必须首先创建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)如果是,那么什么被序列化,对象的状态在哪里被持久化?
该类及其实现可序列化的所有基类的所有非瞬态非静态成员变量将在某些媒体/文件中得到持久化。对象的状态将保存到持久化存储中,并在将来需要时从保存的信息重建对象。一旦写入对象,该状态将得到持久化somewhere@sidgate 这基本上是一个同义反复。哟