在Java中序列化静态属性

在Java中序列化静态属性,java,serialization,Java,Serialization,如果我尝试序列化一个静态属性,会发生什么 感谢您的光临: 技巧1:处理静态变量 Java类通常包含一些 静态模型中的全局相关值 类变量。我们不会参与 争论的历史源远流长 全局变量的适当性- 我们就说程序员 继续发现它们有用,并且 纯粹主义者提出的替代方案 它们并不总是实用的 对于 声明时初始化, 序列化不显示任何内容 特殊问题。第一次 类中的变量 问题将被设置为正确的 价值观 某些静态数据无法在本周内初始化 对。例如,它们可以由 一个人在跑步的时候 节目。假设我们有一个静电场 打开调试的变量 类

如果我尝试序列化一个静态属性,会发生什么

感谢您的光临:

技巧1:处理静态变量 Java类通常包含一些 静态模型中的全局相关值 类变量。我们不会参与 争论的历史源远流长 全局变量的适当性- 我们就说程序员 继续发现它们有用,并且 纯粹主义者提出的替代方案 它们并不总是实用的

对于 声明时初始化, 序列化不显示任何内容 特殊问题。第一次 类中的变量 问题将被设置为正确的 价值观

某些静态数据无法在本周内初始化 对。例如,它们可以由 一个人在跑步的时候 节目。假设我们有一个静电场 打开调试的变量 类中的输出。这个变量可以 通过向服务器发送一些 信息,可能来自监视器 节目。我们还可以想象当 服务器收到此消息时 操作员希望在中打开调试 该类在中的所有后续使用 连接到该服务器的客户端 服务器

程序员现在面临着一个问题 困难。当有问题的班级 到达客户端时,静态 变量的值不随它一起提供。 但是,它包含默认值 当 类的无参数构造函数是 由
writeObject()
调用。怎么可能 客户端程序接收新的 正确的值

程序员可以创建另一个 消息类型并将其传输到 客户然而,这需要一个 消息类型的激增, 破坏了使用 序列化可以在 信息。我们想出的解决办法 with是为需要 静态传输以包括 “statictransporter”内部类。这 类知道所有静态 其外部类中必须 准备好了。它包含一个成员变量 对于每个必须 连载。静态传送副本 将静态变量转换为其成员变量 在 班级。
readObject()
方法 “打开”此捆绑包并进行传输 服务器的静态设置 将变量添加到客户端。因为它是一个 内部类,它将能够写入 外部类的静态变量, 不管隐私级别如何 他们被宣布的

从另一个角度:

静态或瞬态数据 然而,这种“轻松”在中国并非如此 所有案例。我们将看到, 序列化不是那么容易应用的 到具有静态或瞬态的类 数据成员。仅关联的数据 一个类的特定实例是 序列化,因此是静态数据, 即,与类关联的数据 与实例相反,不是 自动序列化。连载 数据存储在一个静态变量中 必须提供特定于类的 序列化

类似地,有些类可以定义 要用作草稿的数据成员 变量。序列化这些数据 成员可能没有必要。一些 瞬态数据的示例包括 运行时统计信息或哈希表 映射引用。这些数据应该 用瞬态修饰符标记 以避免序列化。暂时的 定义,用于指定数据 程序员不需要的成员 想要或需要序列化。看见 简而言之,Java,第174页:鼠标 位置、首选大小、文件句柄 (特定于机器的(本机代码))

当编写代码时,如果某个东西 声明为transient,则会触发 (对程序员)编程的必要性 特殊码的可能性 稍后

要序列化对象,请创建 某种类型的OutputStream对象和 然后把它包在一个盒子里 ObjectOutputStream对象。在这 你只需要打个电话
writeObject()
您的对象是 神奇地序列化并发送到 输出流。为了扭转这一进程, 将输入流包装在 ObjectInputStream和调用
readObject(
)。回来的是 通常,向上投射对象的句柄, 所以你必须沮丧地去安排事情 直的如果您需要动态 查询对象的类型,您可以 使用getClass方法。明确地
dk.getClass.getName()
返回名称
dk
是一个实例的类的 属于也就是说,它向对象请求 其对应类的名称 对象(嗯,是的,但是那你呢 语法?我还需要知道它是什么 就是声明它…太糟糕了)(C++可以 只需一次操作(
dynamic\u cast
(如果类型错误,则提供null)),java可以 使用
instanceof
运算符检查 这就是我的想法(参见核心Java,Ch5 继承,铸造部分)


是的,我们可以明确地序列化静态变量,但是我们无法对静态变量进行序列化。 原因是静态变量没有绑定到范围中的任何对象。 我们序列化对象以存储它们,以便以后检索它们以供任何使用

只有暂时变量不能序列化。

可以序列化静态变量/属性的值。但严格来说,变量或属性本身不能序列化,无论是类级、实例级还是方法的本地变量或属性

通常情况下,对象的实例级属性被序列化为父对象的一部分;即它们是其属性的对象。如果将其转换为类级属性,则概念上的父对象就是类。而存在表示此类的运行时对象(即
this.getClass()
返回的
java.lang.Class
),此对象不是s