如果我尝试序列化一个静态属性会怎么样?
感谢
答案 0 :(得分:2)
从此article:
提示1:处理静态变量
Java类通常有一些 静态中的全局相关值 类变量。我们不会进入 辩论的悠久历史 全球变量的适当性 - 我们只是说程序员 继续发现它们有用而且 纯粹主义者提出的替代方案 并不总是实用的。
对于静态变量 声明时初始化, 序列化不会出现任何问题 特殊问题。第一次 使用了类,变量在 问题将被设置为正确 值。
有些静力学无法初始化 办法。例如,他们可能会被设定 一个人在运行时间 程序。假设我们有一个静态的 打开调试的变量 类中的输出。这个变量可以 通过发送一些设置在服务器上 消息,也许来自监视器 程序。我们也会想象什么时候 服务器获取此消息, 运营商希望调试打开 所有后续使用的课程 与之相关的客户 服务器
程序员现在面临着一个问题 困难。当班级有问题 到达客户端,静态 变量的值不随附。 但是,它包含默认值 当时设置的静态 class的无参构造函数是 由
writeObject()
召集。怎么可以 客户端程序收到新的 正确的价值?程序员可以创建另一个 消息类型并将其传输到 客户;但是,这需要一个 消息类型的扩散, 损害使用的简单性 序列化可以实现 消息。我们提出的解决方案 与是需要的类 静态传输包括a “静态运输者”内在阶级。这个 class知道所有的静态 必须在其外部类中的变量 被设定。它包含一个成员变量 对于每个必须的静态变量 序列化。 StaticTransporter副本 静态成为其成员变量 在
writeObject()
方法中 类。readObject()
方法 “打开”这个捆绑并传输 服务器的静态设置 变量到客户端。因为它是一个 内在的类,它将能够写入 外类的静态变量, 无论隐私程度如何 他们被宣布了。
来自另一个article:
静态或瞬态数据
然而,这种“轻松”并非如此 所有情况。正如我们将看到, 序列化不是那么容易应用的 到具有静态或瞬态的类 数据成员。只有数据相关联 具有类的特定实例是 序列化,因此静态数据, 也就是说,与类相关的数据 与实例相反,不是 自动序列化。要序列化 数据存储在一个静态变量中 必须提供特定类别 序列化。
同样,某些类可能会定义 数据成员用作临时 变量。序列化这些数据 成员可能是不必要的。一些 瞬态数据的例子包括 运行时统计信息或哈希表 映射参考。这些数据应该 用transient修饰符标记 避免序列化。瞬态,由 定义,用于指定数据 程序员没有的成员 想要或需要序列化。看到 “坚果壳中的Java”,第174页:鼠标 位置,首选大小,文件句柄 (特定于机器(本机代码))。
当编写代码时,如果有的话 声明为瞬态,然后触发 (对程序员)的必要性 特殊代码的可能性 序列化。
要序列化对象,请创建 某种OutputStream对象和 然后把它包在里面 ObjectOutputStream对象。在这 指出你只需要打电话
writeObject()
你的对象是 神奇地序列化并发送给 的OutputStream。要扭转这个过程, 你将一个InputStream包装在一个 ObjectInputStream和调用readObject(
)。回来的是,作为 通常,一个upcast对象的句柄, 所以你必须垂头丧气来设置东西 直行。如果你需要动态 查询对象的类型,即可 使用getClass方法。特别dk.getClass.getName()
返回名称dk
是一个实例的类 的。即,这要求对象 其对应类的名称 宾语。 (嗯,是的,但是怎么样 句法?我还需要知道它是什么 是声明它......太糟糕了)(C ++可以 在一次操作中执行此操作(dynamic_cast
(如果错误类型,则给出null)),java可以 使用instanceof
运算符来检查它 是我的想法(参见Core Java,Ch5 继承,铸造部分)
答案 1 :(得分:0)
是的,我们可以defnitely序列化静态变量,但是我们无法在静态变量上获得任何序列化的目的。 为什么因为静态变量不限于范围内的任何对象。 我们序列化对象以存储它们,以便以后可以检索它们以供任何使用。
只有Transient变量才能使它们序列化。
答案 2 :(得分:0)
您可以序列化静态变量/属性的值。但严格来说,您不会自行序列化变量或属性,无论是类级别,实例级别还是方法本地。
通常,对象的实例级属性被序列化为,作为父对象的一部分;即它们属于的对象。如果将其转换为类级属性,则名义父级是类。虽然有一个表示此类的运行时对象(即java.lang.Class
返回的this.getClass()
),但此对象不可序列化。因此,从这个角度来看,类级别(静态)属性不可序列化。