【问题标题】:What does java serialization process serialize? [closed]java序列化过程序列化什么? [关闭]
【发布时间】:2012-07-04 17:32:26
【问题描述】:

java 为一个对象序列化什么?

静态字段?

非静态字段?

方法原型?

方法体?

【问题讨论】:

标签: java oop serialization


【解决方案1】:

默认情况下,用内置的东西?

非静态(非瞬态)字段,对类的引用(完全确定方法原型和主体),仅此而已。

自定义序列化可以为所欲为,但序列化应该是写一个单一的实例对象,这当然排除了静态方法或变量...

【讨论】:

  • 不是对类的引用,而是类的名称
【解决方案2】:

方法没有被序列化,因为它们来自类定义本身。静态字段没有被序列化,因为它们再一次不属于实例本身,而是属于类(如果序列化值可以应用于另一侧,那么在每个实例中序列化某些东西的意义是什么? )。所以答案只是字段。

但是即使对于字段,也存在文件被限定为transient 并且这些不会被序列化的情况。例如:

public class T implements Serializable {
   transient int i = 0;
}

在这种情况下,i 不会被序列化,每个反序列化的实例都将呈现值为 0 的i

【讨论】:

    【解决方案3】:

    静态字段?

    没有

    非静态字段?

    如果它们不是transient 并且类实现Serializable

    方法原型?

    没有

    方法体?

    没有。

    【讨论】:

      【解决方案4】:

      它序列化实例数据,而不是静态数据或方法。有多种方法可以调整保存的数据,使用 transient 关键字、Externalizable 接口和其他一些东西。

      至关重要的是,如果一个对象直接或间接引用其他对象,所有其他对象也将被序列化。因此,序列化一个对象可能会导致数百万个对象的序列化。它是一个强大的工具,对善恶。

      此外,如果您将多个对象写入 ObjectOutputStream,并且已经直接或间接写入了一个对象,则只会将引用发送到流。在被读取时,新对象将包含第一次写入的数据。写入文件时这不是问题,但是(以及大量的内存使用)在写入套接字时可能会令人尴尬。 (无论如何,这让我很尴尬。提示:使用 reset() 方法。)

      【讨论】:

        猜你喜欢
        • 2012-05-18
        • 2011-01-29
        • 2012-09-22
        • 2013-05-26
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多