Merlin的魔力: 长期持久性

Merlin 的一种新功能在 Sun 的 Swing Connection 中以各种形式出现已有一段时间了,实际上它首次被讨论是在 1999 年的 JavaOne 展示会上。这个功能可以将 JavaBean 组件状态长期持久地保存在 XML 文档中。序列化工作适合短期编组的需要(对于 CORBA 和 RMI)或适合将状态信息保存在一个执行的 servlet 中。但是序列化会产生许多问题,包括类库版本或 Java 运行时环境方面的问题。新的 XMLEncoder / XMLDecoder 类允许将 JavaBean 组件状态转储到文本文件中以便易于在 Java 程序外部进行修改,或者更有可能的是为了生成这种文件。让我们看一下如何使用这两个类以及如何分析生成的文件。

开始

开始时,我们需要定义一个我们要初始化、保存和重新创建的类。让我们定义一个带有以下 4 个属性的类:

测试分数的整数数组,可当做一个经过索引的属性

只读 float 属性,表示平均分数

String 属性,代表学生的姓名

java.awt.Point 属性,代表学生在班里的座位

这个可变的属性类型集将演示编码器如何处理不同的数据类型。 清单 1 显示样本类定义。(它也在 net.zukowski.ibm 包中。请参阅 参考资料,下载本文中使用的代码。)那儿甚至有一个有用的 toString() 方法,我们可以使用这个方法直观地看到检索出的值是设置正确的。

保存状态

既然我们有了用于保存的类,我们可创建一个实例并使用 XMLEncoder 进行保存。这个类可以在 java.beans 包中被找到,它的工作原理与 ObjectOutputStream 相同,但不是 OutputStream 类层次结构的一部分。您可以将要保存到的输出流对象传入 OutputStream ,并调用其 writeObject() 方法将对象写入到流中。这很简单。

清单 2. 创建一个实例并将其保存为 XML // Create
  Sample sample = new Sample();
  sample.setScores(new int[] {100, 90, 75});
  sample.setName("Gore");
  sample.setSeat(new Point(5, 3));
  // Save
  XMLEncoder encoder = new XMLEncoder(
   new BufferedOutputStream(
    new FileOutputStream("Sample.xml")));
  encoder.writeObject(sample);
  encoder.close();

检查格式

当检查清单 3 所示的 XML 文件时,您会注意到如何读取格式是与输出在一起编码的,在本例中是与 v1.4 beta 中的 XMLDecoder 一起编码的。这种方法使得将来的发行版能够更改格式,这样如果使用的是比较旧的 XML 文件,新的解码器在生成 XML 文件时会知道使用的是哪种编码类型。从本质上来说,这个文件是一个正规 XML 文件,服从特定的 DTD(本文中没有引用到)。但是,解码器能够识别该文件。

清单 3. 经过编码的 XML 样本实例<?xml version="1.0" encoding="UTF-8"?>
<java version="1.4.0-beta" class="java.beans.XMLDecoder">
  <object class="net.zukowski.ibm.Sample">
   <void property="name">
    <string>Gore</string>
   </void>
   <void property="scores">
    <array class="int" length="3">
     <void index="0">
      <int>100</int>
     </void>
     <void index="1">
      <int>90</int>
     </void>
     <void index="2">
      <int>75</int>
     </void>
    </array>
   </void>
   <void property="seat">
    <object class="java.awt.Point">
     <int>5</int>
     <int>3</int>
    </object>
   </void>
  </object>
</java>

这个特定的 XML 文件未显示如何嵌入用于复位 bean 属性的方法调用,如添加侦听器以及将组件添加到容器。

时间: 2024-10-06 19:38:41

Merlin的魔力: 长期持久性的相关文章

Merlin的魔力: Swing 的新JFormattedTextField组件

Java 2 标准版(J2SE),版本 1.4 为可用的 GUI 元素调色板添加了 2 个新的 Swing 组件: JSpinner 和 JFormattedTextField .在 Merlin 的魔力专栏的第一篇我们就介绍了 JSpinner 组件:我们现在将要探讨 JFormattedTextField . 虽然 JFormattedTextField 组件看起来与 JTextField 相似,但是它的行为与 JSpinner 完全不同.在最简单的情况下,您可以为电话号码提供一个类似"(#

Merlin的魔力: 异常和日志记录

为了理解问题的根源并适当地响应,Merlin 发行版添加了几个与异常处理相关的功能.现在,您不必手工分析堆栈转储信息就可以检查堆栈跟踪信息,并且可以把异常连成一条菊花链,这样就能够在重新抛出异常时附加上异常的原因,这会大大促进调试工作.此外,现在还有一个内建的日志记录工具用来记录消息的不同级别.在 Merlin 的魔力系列的这一部分,John Zukowski 演示了这些新的日志记录和异常功能的工作原理并提供了一个示例程序以供查看和下载. 这个 Merlin 发行版中新添加的许多功能(比如异常处

Merlin的魔力: J2SE 1.4.2提供两种新的外观设计

迄今为止,所有Merlin的魔力专栏都是关于Java 1.4版本的新特性,本文主要针对目前正在测试的1.4.2版本.Sun认为Windows的经典外观已经过时,没有人再使用Motif了 -- 至少在用户桌面上.您将在这一标准Java平台的最新版本中找到新款Windows外观以及称为GTK+的全新外观,当用户使用Windows XP操作系统时新款Windows外观看起来象Windows XP,GTK+使用普通Linux桌面的外观. Swing架构提供可插入外观框架.例如,该框架提供一种标准方法使所

Merlin的魔力: Java联网增强技术

Java 编程中的联网包括了定位和识别资源的能力以及通过 TCP 和 UDP 连接进行通信的能力.首先,您需要识别具有象 www.ibm.com 这样名称的资源,然后打开到该资源的连接,最后在您自己和连接的另一端之间发送信息包.由于安全性原因,可能会包括其它任务,但是整个过程是一样的.对于 Java 平台,会在 java.net 包中找到支持这些操作的类.从 Java 编程的早期到现在,这些操作中大多数都未曾发生太大的变化.但是,随着 Merlin 的发展,这些基本操作中有些已经作了改进,以支持

Merlin的魔力: Merlin的新I/O缓冲区的输入和输出

Java 2 平台标准版(Java 2 Platform Standard Edition,J2SE)1.4 对 Java 平台的 I/O 处理能力做了大量更改.它不仅用流到流的链接方式继续支持以前 J2SE 发行版的基于流的 I/O 操作,而且 Merlin 还添加了新的功能 - 称之为新 I/O 类(NIO),现在这些类位于 java.nio 包中. I/O 执行输入和输出操作,将数据从文件或系统控制台等传送至或传送出应用程序.(有关 Java I/O 的其它信息,请参阅 参考资料). 缓冲

Merlin的魔力: 焦点,焦点,还是焦点

基于Swing的GUI还有一些遗留问题,包括如何管理焦点(哪个组件有接收键盘输入的优先权),如何判断哪个组件拥有焦点,以及如何将焦点从一个组件遍历到下一个组件.由于Swing建立在抽象窗口工具包(AWT)之上,对组件焦点的管理便依赖于AWT中的底层焦点管理.Java平台过去的版本依赖于本地的窗口管理器来协助进行焦点管理,所以尽管有些开发者会认为焦点控制是在他们的应用程序内部进行的,而实际情况并非如此.由于对底层的本地焦点系统的依赖性,因而出现了许多平台不相容的现象. 至于Merlin,它为您提供

Merlin的魔力: 格式化数值和货币

java.text 包允许通过与特定语言无关的方式格式化文本消息.日期和数值.许多人配合 MessageFormat 类使用资源包来为用户本地化消息.更多的人似乎使用 DateFormat 和 SimpleDateFormat 类来操作日期字符串,既用于输入也用于输出.最少见的用法似乎是使用 NumberFormat 类及其相关的子类 DecimalFormat 和 ChoiceFormat .在本月的讨论中,我们将研究一下这三个未得到充分利用的类以及 Currency 类,看看 J2SE 1.

Merlin的魔力: SpringLayout管理器

在 Java 布局管理器方面,最新增加了 SpringLayout 管理器,它是与 Java 1.4 一起发布的.这种布局管理器允许您将"spring"附加到组件上,这样组件就可以相对于其他组件进行布局.例如,利用 SpringLayout 您可以让一个按钮依附于右边框来进行显示,而不管用户将屏幕宽度设为多大. 开始使用 SpringLayout 与所有布局管理器一样, SpringLayout 管理器负责安排组件的位置.组件的位置是通过为之提供相关联的约束来进行控制的.对于 Spri

Merlin的魔力: Swing中的声音

J2SE 版本 1.4 中新增了一项有趣的 Swing 功能.Swing 控件现在可以提供听觉反馈来对特定事件作出响应,不过缺省情况下这项功能是禁用的.新增的这项功能有助于 Swing 控件更好地模仿系统本地操作系统的控件的行为. 听觉基本知识 Swing 使用一种可插式外观和感觉(Pluggable Look-and-Feel,PLAF)体系结构.开发者不必针对不同组件为颜色和字体之类的设置进行硬编码:取而代之的是,组件将从用户界面管理器(User Interface(UI)Manager)请