在 Java 中序列化静态属性

2024-05-09

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

thanks


由此article http://java.sys-con.com/node/36149:

技巧 1:处理静态变量

Java classes often hold some globally relevant value in a static class variable. We won't enter into the long history of the debate over the propriety of global variables - let's just say that programmers continue to find them useful and the alternatives suggested by purists aren't always practical.

对于静态变量 声明时初始化, 序列化不存在任何 特殊问题。第一次 使用类,变量在 问题将被设置为正确的 价值。

某些静态数据无法初始化 方式。例如,它们可以由以下方式设置 一个人在运行期间 程序。假设我们有一个静态的 打开调试的变量 输出在一个类中。这个变量可以 通过向服务器发送一些内容来设置 消息,可能来自监视器 程序。我们也会想象当 服务器收到此消息后, 操作员希望在以下位置打开调试 该类的所有后续使用 连接到的客户端 服务器。

程序员现在面临着一个 困难。当有问题的班级 到达客户端后,静态 变量的值不随之而来。 但是,它包含默认的 静态时设置的 类的无参构造函数是 打电话给writeObject()。怎样才能 客户端程序接收新的 正确的值?

程序员可以创建另一个 消息类型并将其传输到 客户;然而,这需要一个 消息类型的激增, 破坏了使用的简单性 序列化可以实现 消息传递。我们提出的解决方案 with 是针对需要的类 静态传输包括 “静态传输器”内部类。这 类知道所有静态 其外部类中的变量必须 被设置。它包含一个成员变量 对于每个静态变量必须是 连载了。静态传输器副本 将静态值放入其成员变量中 在里面writeObject()的方法 班级。这readObject()方法 “解开”这个包并传输 服务器的静态设置 变量给客户端。既然它是一个 内部类,它将能够写入 外部类的静态变量, 无论隐私级别如何 他们被宣布。

并从另一个article http://www.ecst.csuchico.edu/~amk/foo/advjava/notes/serial.html:

静态或瞬态数据

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

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

编写代码时,如果有东西 声明瞬态,然后触发 (对程序员)的必要性 特殊代码的可能性 稍后连载。

要序列化一个对象,您可以创建 某种 OutputStream 对象和 然后将其包裹在一个 ObjectOutputStream 对象。在这 点你只需要打电话writeObject()你的对象是 神奇地序列化并发送到 输出流。为了扭转这个过程, 你将一个InputStream包装在一个 ObjectInputStream 并调用readObject()。返回的是,如 通常,向上转换对象的句柄, 所以你必须沮丧地安排事情 直的。如果你需要动态 查询对象的类型,可以 使用 getClass 方法。具体来说dk.getClass.getName()返回名称 那个班级的dk是一个实例 的。即,这要求对象提供 其对应的类名 目的。 (嗯,确实如此,但是呢 句法?我还需要知道它是什么 就是声明它...太糟糕了)(C++可以 在一次操作中执行此操作(dynamic_cast(如果类型错误则返回 null)),java 可以 使用instanceof操作员检查是否 我是这么想的(参见 Core Java,Ch5 继承、铸造部分)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中序列化静态属性 的相关文章

  • Spring @PostConstruct 依赖于 @Profile

    我想在一个配置类中拥有多个 PostConstruct 带注释的方法 这些方法应该根据 Profile 进行调用 你可以想象这样的代码 Configuration public class SilentaConfiguration priv
  • 在这个 Spring MVC 展示示例中如何使用 @RequestAttribute 和 @ModelAttribute 注释?

    我对 Spring MVC 还很陌生 这段时间我正在学习Spring MVC 展示 https github com spring projects spring mvc showcase可从 STS 仪表板下载示例 我在理解此示例中如何处
  • 为什么 Java 中需要 String[] args?

    我知道 String args 是作为参数传递到 main 的字符串数组 java Print Hello World class Print public static void main String args System out p
  • Spring Kafka - 为任何主题的分区消耗最后 N 条消息

    我正在尝试读取请求的卡夫卡消息数 对于非事务性消息 我们将从 endoffset N 对于 M 个分区 开始轮询并收集当前偏移量小于每个分区的结束偏移量的消息 对于幂等 事务消息 我们必须考虑事务标记 重复消息 这意味着偏移量将不连续 在这
  • 用Java截取网页的屏幕截图[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个免费的工具可以读取给定的网页并截取它的屏幕截图 我使用 VirtualFramebuffer 和 Firefox Binary
  • 如何处理类结构的变化并向后兼容使用 boost 序列化的数据/对象?

    我的任务是向使用的 C 类添加成员 boost serialization access 这些对象被存储到文本文件中并读回 但是 我需要向后兼容 并且新的 bool 成员必须被序列化 我需要允许新代码读取旧文件并仅写入新格式 具体来说 序列
  • 为什么需要添加工件 JSR305 才能使用 Guava 14+?

    在stackoverflow上查找信息时 我看到了一个与我类似的问题 但没有真正的答案here https stackoverflow com questions 3800033 guava r07 gwt and javax annota
  • 如何将 (A OR B) AND C 等表达式展开为 A AND C OR A AND B?

    我努力了Javaluator这帮助我评估了这样的表达式 A OR B AND C 但现在我只想扩展表达式 A OR B AND C to A AND C OR A AND B任何人都可以告诉我如何在 Java 任何 API 中执行此操作或任
  • JConsole主类

    我正在尝试使用其 Main 类从命令行启动 JConsole 我提取了 jconsole jar 的内容 在 MANIFEST MF 中我可以看到 Main Class sun tools jconsole JConsole 所以我尝试运行
  • 原型组件的 Spring 事件处理

    假设我有两个组件 X 和 Y 其中 X 是单例 而 Y 不是 当我发布XUpdateEvent时 没有问题 我可以捕获该事件 但是 对于 YUpdateEvent 我无法捕获事件 Spring 为每个触发的事件创建新实例 而不是使用已经创建
  • Java RCP/SWT - Eclipse RCP 中的“Android Toast like”对话框

    有谁知道是否存在某些弹出窗口的实现 例如 Android TOAST 通知是以下内容的一部分迈林公共区 https projects eclipse org projects mylyn commons 要集成它们 请添加Mylyn Com
  • 结构体到磁盘的高效 Go 序列化

    我的任务是将 C 代码替换为 Go 而且我对 Go API 还很陌生 我正在使用 gob 将数百个键 值条目编码到磁盘页面 但 gob 编码有太多不需要的膨胀 package main import bytes encoding gob f
  • 使用 IntelliJ 调试 Java 进程 - 连接到套接字但不连接到目标 VM

    现在已解决 请参阅问题末尾 我正在尝试使用 IntelliJ Community Edition 的调试器来调试 Java 进程 套接字正在侦听 但是当我尝试连接时 调试过程显示以下内容 连接到目标虚拟机 地址 8003 传输 socket
  • 结果显示图像上有衬里

    我正在使用 opencv 和 android ndk 下面是我的 jni 代码 void Vignete Mat img1 Mat img2 Mat out resize img1 img1 img2 size img1 convertTo
  • Java 线程 JavaDoc

    我编写了一个只能在特定线程上调用的方法 是否应该将标准注释或注释添加到方法的 javadoc 中来表示这一点 不知道有任何这样的标准注释 Java 并发实践 http www javaconcurrencyinpractice com 在第
  • javax.validation 的 @AssertTrue - 它不应该创建错误消息吗?

    我在 Spring MVC 命令 bean 中有以下代码 AssertTrue public boolean isConditionTrue return false private boolean conditionTrue 我的 JSP
  • 如何使用二叉树中的递归来完成回溯

    我正在尝试插入一个二进制节点 我的代码很复杂 没有希望挽救它 所以我计划重写它 基本上我没有考虑回溯 也没有仔细考虑算法 我正在尝试使用顺序遍历插入二进制节点 但我不明白应该如何回溯 D B E A C F 我如何搜索根 D 的左子树 然后
  • Tomcat 与 Weblogic JNDI 查找

    我们使用的 Weblogic 服务器已配置为允许 JNDI 数据源名称 例如 appds 对于开发 本地主机 我们可能会运行 Tomcat 并且在 server xml 的 部分中声明时 Tomcat 会将 JNDI 数据源挂在 JNDI
  • 所有语言中特殊字符的 Java 正则表达式

    在我的用户输入字段中 我想允许某些特殊字符 字母和数字的组合 我应该确保正则表达式模式在输入时允许此设置任何语言 基本上我构建的这个正则表达式也应该支持 unicode 表示 如何使用 Java 中的 Pattern 类来实现这一点 这里给
  • 如何将 Hibernate 5 安装到 Apache Karaf v4 中

    我已经安装了 Apache Karaf v4 03 并查询了 Hibernate 的可用功能列表 如下所示 不幸的是 我使用的是 Hibernate v5 hibernate 3 3 2 GA Uninstalled enterprise

随机推荐