使用 XStream 把 Java 对象序列化为 XML

开发 后端
XML 序列化用处很多,包括对象持久化和数据传输。但是一些 XML 序列化技术实现起来可能很复杂。XStream 是一个轻量级的、简单易用的开放源代码 Java™ 库,用于将 Java 对象序列化为 XML 或者再转换回来。了解如何设置 XStream,如何使用它序列化和逆序列化对象以及从 XML 配置文件读取配置属性。

使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列化工具而不是数据绑定工具,就是说不能从 XML 或者 XML Schema Definition (XSD) 文件生成类。

和其他序列化工具相比,XStream 有三个突出的特点:

1. XStream 不关心序列化/逆序列化的类的字段的可见性。

2. 序列化/逆序列化类的字段不需要 getter 和 setter 方法。

3. 序列化/逆序列化的类不需要有默认构造函数。

不需要修改类,使用 XStream 就能直接序列化/逆序列化任何第三方类。


设置开发环境

按照下列步骤下载和安装 XStream(下载链接参见 参考资料):

1. 从 Eclipse 网站下载 Eclipse。安装的时候将其解压到选定的文件夹,本文中用 eclipse_home 表示。本文假定使用 Eclipse 3.3。

2. 从 XStream 网站下载最新的 XStream 稳定版本。安装的时候解压到选定的文件夹,本文用 xstream_home 表示。假定使用的 XStream 版本是 1.2.2。

3. 从 Sun 网站下载 Java Platform, Standard Edition (J2SE) 软件开发工具箱(SDK)。安装到选定的文件夹,本文用 java_home 表示。假定版本为 1.5.0_05。

创建一个 Java 项目

要创建一个 Java 项目,需要选择 File > New > Project,然后按下列步骤操作:

1. 选择 Java > Java Project > Next(如图 1 所示)。

 
图 1. 新建 Java 项目

2. 填写项目名称并单击 Next(如 图 2 所示)。 

 
图 2. 填写项目名称

3. 单击 Finish 完成该任务(如 图 3 所示)。

 
图 3. 完成设置

#p#

图 4 显示了新建的 Java 项目。

 
图 4. 新建的 Java 项目

添加 XStream 支持

按照下列步骤向新建的项目添加 XStream 库:

1. 在 Eclipse 的 Project Explorer 中选择新建的项目,从 Project 菜单中选择 Properties(如 图 5 所示)。

 
图 5. 添加 XStream 库

2. 单击 Add External JARs,从 xstream_home/lib 文件夹中选择 xstream-1.2.2.jar。

3. 单击 OK 结束(如 图 6 所示)。

 
图 6. 完成 XStream 支持的添加

图 7 显示了添加 XStream 支持后的项目。

 
图 7. 添加的库


序列化对象

这个简单的例子示范了如何使用 XStream 序列化/逆序列化对象,包括两个类:Writer 和 Reader。Writer 类使用 XStream API 把 Employee 类型的对象序列化为 XML 并存储到文件中(如 清单 1 所示)。

清单 1. Writer.java

package com.samples;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import com.thoughtworks.xstream.*;

public class Writer {

 public static void main(String[] args) {
 Employee e = new Employee();

 //Set the properties using the setter methods
 //Note: This can also be done with a constructor.
 //Since we want to show that XStream can serialize
 //even without a constructor, this approach is used.
 e.setName("Jack");
 e.setDesignation("Manager");
 e.setDepartment("Finance");

 //Serialize the object
 XStream xs = new XStream();

 //Write to a file in the file system
 try {
 FileOutputStream fs = new FileOutputStream("c:/temp/employeedata.txt");
 xs.toXML(e, fs);
 } catch (FileNotFoundException e1) {
 e1.printStackTrace();
 }
 }
}

Reader 类读取该文件,逆序列化 XML 并把数据装入 Java 对象(如 清单 2 所示)。

#p#

清单 2. Reader.java

package com.samples;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class Reader {

 public static void main(String[] args) {
 XStream xs = new XStream(new DomDriver());
 Employee e = new Employee();

 try {
 FileInputStream fis = new FileInputStream("c:/temp/employeedata.txt");
 xs.fromXML(fis, e);

 //print the data from the object that has been read
 System.out.println(e.toString());

 } catch (FileNotFoundException ex) {
 ex.printStackTrace();
 }

 }
}

清单 3 显示了 Employee 对象的结构。

package com.samples;

public class Employee {
 private String name;
 private String designation;
 private String department;

 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getDesignation() {
 return designation;
 }
 public void setDesignation(String designation) {
 this.designation = designation;
 }
 public String getDepartment() {
 return department;
 }
 public void setDepartment(String department) {
 this.department = department;
 }
 @Override
 public String toString() {
 return "Name : "+this.name+
 "\nDesignation : "+this.designation+
 "\nDepartment : "+this.department;
 }
}


读取配置文件
 
多数应用程序都要用到一些属性。这些属性可能是要连接的数据源的名称或者日志文件的位置。配置文件最适合存储这类数据,从而在修改这些属性的时候不需要重新编译应用程序,应用程序维护起来也更容易。下面的例子说明如何在应用程序中使用 XStream 从 XML 配置文件中读取配置属性。

XML 数据绑定通常需要从 XML 文件生成 Java 对象。使用 XStream 省略了生成对象这个步骤。只需要编写一个 Java 类将类的字段映射到希望读取的 XML 的元素。这个例子使用的配置文件如 清单 4 所示。

清单 4. Config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
 <datasource-name>IRIS</datasource-name>
 <ipaddress>9.124.74.85</ipaddress>
 <logfilename>DailyLogApplication.log</logfilename>
 <appender>console</appender>
</config>

清单 5 显示的 ConfigReader 类读取该配置文件并将属性加载到 Java 对象中。

清单 5. ConfigReader.java

package com.samples;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class ConfigReader {

 String datasourcename = null;
 String ipaddress = null;
 String logfilename = null;
 String appender = null;

 @Override
 public String toString() {
 // This method prints out the values stored in the member variables
 return "Datasource Name : "+datasourcename+
 " \nIP Address : "+ipaddress+
 " \nLogfilename : "+logfilename+
 " \nAppender : "+appender;
 }

 /**
 * @param args
 * @throws FileNotFoundException
 */
 public static void main(String[] args) throws FileNotFoundException {
 XStream xs = new XStream(new DomDriver());

 FileInputStream fis = new FileInputStream("c:/temp/Config.xml");
 xs.aliasField("datasource-name", ConfigReader.class, "datasourcename");
 xs.alias("config", ConfigReader.class);
 ConfigReader r = (ConfigReader)xs.fromXML(fis);

 System.out.println(r.toString());
 }
}


结束语

创建和开发使用 XStream 的应用程序只需要简单的几个步骤。本文介绍如何使用 XStream 序列化/逆序列化 Java 对象和读取配置文件,通过 XStream 网站(教程链接参见 参考资料)可以进一步了解别名、注解和转换程序。别名和转换程序可以让您完全控制生成的 XML。

【编辑推荐】

  1. JavaScript解析XML的方法总结
  2. 在ASP.NET中使用Treeview控件和XML
  3. SQL Server 2005中XML操作函数详解
责任编辑:杨鹏飞 来源: IBM
相关推荐

2010-01-04 09:40:46

F#对象

2009-03-10 13:38:01

Java序列化字节流

2012-04-13 10:45:59

XML

2010-01-08 13:25:07

ibmdwXML

2009-09-09 15:47:27

XML序列化和反序列化

2009-09-09 14:45:41

XML序列化和反序列化

2018-03-19 10:20:23

Java序列化反序列化

2009-06-14 22:01:27

Java对象序列化反序列化

2011-05-18 15:20:13

XML

2011-06-01 15:05:02

序列化反序列化

2012-02-14 10:29:02

Java

2013-02-28 10:00:43

JIDJava序列化

2013-02-27 09:58:32

JavaJID

2011-06-01 14:26:11

序列化

2010-05-14 10:55:04

java对象序列化

2009-08-25 14:59:39

C# XML序列化应用

2009-09-09 17:14:24

XML序列化

2009-09-09 15:54:48

C# XML序列化

2009-09-09 17:10:50

C# XML序列化

2021-08-30 12:25:12

Python序列化函数
点赞
收藏

51CTO技术栈公众号