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

来源:互联网 发布:如何查看数据库主键 编辑:程序博客网 时间:2024/06/06 22:45

转载原文地址:http://www.ibm.com/developerworks/cn/xml/x-xstream/index.html


序列化对象

这个简单的例子示范了如何使用 XStream 序列化/逆序列化对象,包括两个类:Writer 和 ReaderWriter 类使用 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 所示)。

清单 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 对象的结构。

清单 3. Employee.java
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; }}

读取配置文件

读取完整的 XML 文件

下面的例子说明了如何读取一个简单的 XML 文件。要读取完整的 XML 文件可能需要编写自定义的转换程序。XStream “Converter Tutorial” 网站(参见 参考资料)提供了编写转化程序的教程。

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


补充:

//包重命名 xstream.aliasPackage("com", "com.ljq.test"); //包名com.ljq.test记得写正确
//类重命名xstream.alias("Student", Student.class);
//属性重命名xstream.aliasField("birth", Student.class, "birthday");


0 0
原创粉丝点击