【发布时间】:2011-03-10 00:50:44
【问题描述】:
如果我尝试序列化静态属性会发生什么?
谢谢
【问题讨论】:
-
会发生什么?我想你最终会发现它是否有效..
-
你的电脑会立即爆炸,fg - 不,它只是被序列化了。试试看。
标签: java serialization
如果我尝试序列化静态属性会发生什么?
谢谢
【问题讨论】:
标签: java serialization
来自article:
提示 1:处理静态变量
Java 类通常包含一些 静态中的全局相关值 类变量。我们不会进入 辩论的悠久历史 全局变量的适当性 - 让我们说程序员 继续发现它们有用并且 纯粹主义者提出的替代方案 并不总是实用的。对于静态变量 声明时初始化, 序列化不存在任何 特殊问题。第一次 使用类,变量在 问题将设置为正确 价值。
一些静态变量无法初始化 大大地。例如,它们可以由 一个人在运行时间 程序。假设我们有一个静态 打开调试的变量 在一个类中输出。这个变量可以 通过发送一些在服务器上设置 消息,可能来自监视器 程序。我们也会想象当 服务器收到此消息, 操作员希望打开调试 类的所有后续使用 连接到该客户端的客户端 服务器。
程序员现在面临着一个 困难。当有问题的班级 到达客户端,静态 变量的值不附带它。 但是,它包含默认值 设置的静态状态 类的无参数构造函数是 由
writeObject()调用。怎么可能 客户程序收到新的 值正确吗?程序员可以创建另一个 消息类型并将其传输到 客户;然而,这需要一个 消息类型的激增, 破坏了使用的简单性 序列化可以实现在 消息传递。我们提出的解决方案 with 用于需要 静态传输到包括一个 “静态传输器”内部类。这 类知道所有的静态 其外部类中的变量必须 被设置。它包含一个成员变量 对于每个必须是的静态变量 序列化。静态传输器副本 静态变量到它的成员变量中 在
writeObject()方法中 班级。readObject()方法 “解开”这个捆绑包并传输 服务器的静态设置 变量给客户端。由于它是一个 内部类,它将能够写入 外部类的静态变量, 无论隐私级别如何 他们被宣布。
来自另一个article:
静态或瞬态数据
但是,这种“轻松”在 所有情况。正如我们将看到, 序列化不是那么容易应用的 到具有静态或瞬态的类 数据成员。仅关联数据 具有类的特定实例是 序列化,因此是静态数据, 也就是说,与类关联的数据 与实例相反,不是 自动序列化。序列化 存储在静态变量中的数据一 必须提供特定于类的 序列化。
同样,一些类可能定义 用作临时的数据成员 变量。序列化这些数据 成员可能是不必要的。一些 瞬态数据的例子包括 运行时统计信息或哈希表 映射参考。这些数据应该 用瞬态修饰符标记 避免序列化。瞬态,由 定义,用于指定数据 程序员没有的成员 想要或需要被序列化。看 简而言之 Java,第 174 页:鼠标 位置、首选大小、文件句柄 (机器特定(本机代码))。
在编写代码时 声明为瞬态,然后触发 (对程序员)的必要性 特殊代码的可能性 稍后序列化。
要序列化一个对象,你需要创建 某种 OutputStream 对象和 然后把它包在一个 ObjectOutputStream 对象。在这 点你只需要打电话
writeObject()你的对象是 神奇地序列化并发送到 输出流。为了扭转这个过程, 您将 InputStream 包装在一个 ObjectInputStream 和调用readObject()。回来的是,如 通常,一个向上转换对象的句柄, 所以你必须沮丧来设置东西 直的。如果需要动态 查询对象的类型,可以 使用 getClass 方法。具体来说dk.getClass.getName()返回名称dk是一个实例的类的 的。即,这要求对象 其对应类的名称 目的。 (嗯,是的,但是呢? 句法?我仍然需要知道它是什么 是声明它......太糟糕了)(C++可以 一次性完成此操作 (dynamic_cast(如果类型错误,则返回 null)),java 可以 使用instanceof运算符来检查它是否 是我的想法(参见 Core Java, Ch5 继承,铸造部分)
【讨论】:
是的,我们可以明确地序列化静态变量,但我们无法获得对静态变量进行序列化的任何目的。 为什么是因为静态变量没有绑定到范围内的任何对象。 我们序列化对象以存储它们,以便以后可以检索它们以供任何使用。
只有你不能让它们序列化的瞬态变量。
【讨论】:
您可以序列化静态变量/属性的值。但严格来说,您不会序列化变量或属性本身,无论是类级别、实例级别还是方法的本地。
通常,对象的实例级属性被序列化作为父对象的一部分;即它们是属性的对象。如果将其转换为类级别的属性,那么名义上的父级就是类。虽然存在一个表示此类的运行时对象(即 this.getClass() 返回的 java.lang.Class),但该对象不可序列化。所以从这个角度来看,类级别(静态)属性是不可序列化的。
【讨论】: