java 为一个对象序列化什么?
静态字段?
非静态字段?
方法原型?
方法体?
默认情况下,使用内置的东西?
非静态(非瞬态)字段,对类的引用(完全确定方法原型和主体),仅此而已。
自定义序列化可以做任何你想做的事情,但是序列化应该写一个单一的实例对象,这当然排除了静态方法或变量......
方法没有被序列化,因为它们来自类定义本身。静态字段没有被序列化,因为它们再一次不属于实例本身,而是属于类(如果序列化值可以应用于另一侧,那么在每个实例中序列化某些东西的意义是什么? )。所以答案只是字段。
但是即使对于字段,也存在文件被限定为transient
并且这些不会被序列化的情况。例如:
public class T implements Serializable {
transient int i = 0;
}
在这种情况下,i
不会被序列化,并且每个反序列化的实例都将呈现i
值 0。
静态字段?
不
非静态字段?
前提是它们不是transient
并且类实现Serializable
方法原型?
不
方法体?
不。
它序列化实例数据,而不是静态数据或方法。有许多方法可以调整保存的数据,使用transient
关键字、Externalizable
界面和其他一些东西。
至关重要的是,如果一个对象直接或间接地引用了其他对象,那么所有其他对象也将被序列化。因此,序列化一个对象可能会导致数百万个对象的序列化。它是一个强大的工具,无论善恶。
此外,如果您向 ObjectOutputStream 写入多个对象,并且已经直接或间接写入了一个对象,则只会将引用发送到流。在被读取时,新对象将包含第一次写入的数据。写入文件时这不是问题,但是(以及大量内存使用)在写入套接字时可能会令人尴尬。(无论如何,这让我很尴尬。提示:使用reset()方法。)