九、持久化
在第八节的示例中,当我们操作一组对象时,我们可以指定Writer、OutputStream来写出序列化后的XML数据,我们还可以指定Reader、InputStream来读取序列化后的XML数据。当我们需要写出和读取文件时都需要指定输入输出流,并且需要明确的调用输入输出方法来实现Java对象的序列化和反序列化,其实我们完全可以让Java对象的序列化和反序列化操作隐性的、自动的完成,这就是我们要学的内容:PersistenceStrategy、XmlArrayList、XmlMap和XmlSet。
PersistenceStrategy是我们的持久化策略,定义了我们的存储和读取协议,是实际做存储和读取XML的工具。XStream框架提供的持久化策略只有FilePersistenceStrategy这一种,即将XML数据持久化到文件系统中,但是我们可以定义自己的持久化策略(比如持久化到数据库中),只要继承PersistenceStrategy接口就行了。
XmlArrayList、XmlMap和XmlSet是我们熟悉的3个集合工具类,它们可以让我们以我们非常熟悉的方式操作Java对象,并且隐性的存储和读取为我们需要的XML。
下面我们以XmlArrayList为例来学习。
1,简单的存储
程序如下:
package cn.tjpu.zhw.xml.xstream6; import java.io.File; import java.util.List; import com.thoughtworks.xstream.persistence.FilePersistenceStrategy; import com.thoughtworks.xstream.persistence.PersistenceStrategy; import com.thoughtworks.xstream.persistence.XmlArrayList; public class PersistenceMain { public static void main(String[] args) { //创建持久化策略(定义存储工具和存储位置) //注:d:/tmp是一个已存在的目录,否则会报错 PersistenceStrategy strategy = new FilePersistenceStrategy( new File("d:/tmp")); //创建操作工具 List list = new XmlArrayList(strategy); System.out.println("刚创建XmlArrayList对象时list.size()="+list.size()); //添加数据 list.add(new Person("张三")); list.add(new Person("李四")); list.add(new Person("毛毛")); list.add(new Person("大熊")); System.out.println("添加了4个元素之后list.size()="+list.size()); //删除“李四” list.remove(1); System.out.println("删除了1个元素之后list.size()="+list.size()); } } class Person { public Person(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "Person对象的name=" + getName(); } }
运行结果:
刚创建XmlArrayList对象时list.size()=0 添加了4个元素之后list.size()=4 删除了1个元素之后list.size()=3
现在我们查看d:/tmp目录,我们会发现有3个文件int@0.xml、int@1.xml和int@2.xml。这3个文件就是我们存储的3个Person对象,他们的内容分别是:
int@0.xml文件:
<cn.tjpu.zhw.xml.xstream6.Person> <name>张三</name> </cn.tjpu.zhw.xml.xstream6.Person>
int@1.xml文件
<cn.tjpu.zhw.xml.xstream6.Person> <name>毛毛</name> </cn.tjpu.zhw.xml.xstream6.Person>
int@2.xml文件:
<cn.tjpu.zhw.xml.xstream6.Person> <name>大熊</name> </cn.tjpu.zhw.xml.xstream6.Person>
其实,在我们每一次调用add方法的时候,都有一次持久化过程,每次都会将文件写入到d:/tmp目录。
2,所有我们熟悉的操作方法
由于XmlArrayList、XmlMap和XmlSet继承我们熟悉各个集合接口,所以我们可以向操作List、Map和Set一样来操作我们的数据,所不同的是原来我们集合中的数据在内存中,现在却在我们预定义的持久化策略中。
编写程序如下:
package cn.tjpu.zhw.xml.xstream6; import java.io.File; import java.util.Iterator; import java.util.List; import com.thoughtworks.xstream.persistence.FilePersistenceStrategy; import com.thoughtworks.xstream.persistence.PersistenceStrategy; import com.thoughtworks.xstream.persistence.XmlArrayList; public class UsageTestMain { // XmlArrayList的用法 public static void main(String[] args) { // 创建持久化策略(定义存储工具和存储位置) // 注:d:/tmp是一个已存在的目录,否则会报错 PersistenceStrategy strategy = new FilePersistenceStrategy(new File( "d:/tmp")); // 创建操作工具 List list = new XmlArrayList(strategy); System.out.println("刚创建XmlArrayList对象时list.size()="+list.size()); System.out.println(); //获取迭代器 Iterator iter = list.iterator(); System.out.println("******遍历每一个元素******"); //遍历每一个元素 while(iter.hasNext()){ Person p = (Person)iter.next(); System.out.println("当前元素p="+p); } } }
运行结果:
刚创建XmlArrayList对象时list.size()=3 ******遍历每一个元素****** 当前元素p=Person对象的name=张三 当前元素p=Person对象的name=毛毛 当前元素p=Person对象的name=大熊
3,定制自己的转换器(Local Converter)
由于内存中存储了大量数据,我们可以使用文件系统暂存,内存中只记录存放文件的目录即可,这是我们可以自己定义一个转换器:
package cn.tjpu.zhw.xml.xstream6; import java.io.File; import java.util.ArrayList; import java.util.Collection; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.persistence.FilePersistenceStrategy; import com.thoughtworks.xstream.persistence.XmlArrayList; //自己定义一个局部转换器 public final class LocalArrayListConverter implements Converter { private XStream xstream; public LocalArrayListConverter(XStream xstream) { this.xstream = xstream; } //将Collection对象序列化到文件中 //注:序列化时内存中并没有存放集合中的内容,只是暂存了这些文件存放的目录 public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { File dir = new File("d:/tmp"); //创建持久化工具,并加载目录中的所有文件 XmlArrayList list = new XmlArrayList( new FilePersistenceStrategy(dir,xstream)); context.convertAnother(dir); //生成文件 list.addAll((Collection) source); } //从文件中读取信息,反序列换为Collection对象 //注:反序列化时会删除暂存目录下的所有文件 public Object unmarshal( HierarchicalStreamReader reader, UnmarshallingContext context) { File directory = (File) context.convertAnother(null, File.class); //创建持久化工具,并加载目录中的所有文件 XmlArrayList persistentList = new XmlArrayList( new FilePersistenceStrategy(directory, xstream)); //将已加载的信息复制一份到list中 ArrayList list = new ArrayList(persistentList); //删除所有文件 persistentList.clear(); //返回已加载的信息 return list; } public boolean canConvert(Class type) { return type == ArrayList.class; } }
这个转换器是转换ArrayList对象的。
下面是我们的测试程序:
package cn.tjpu.zhw.xml.xstream6; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.thoughtworks.xstream.XStream; public class LocalConverterMain { public static void main(String[] args) { XStream xstream = new XStream(); xstream.alias("volume", Volume.class); //使用自定义的转换器LocalArrayListConverter来转换Volume类的documents字段 //这个转换器是受限制的局部(local)转换器,只能转换Volume类的documents字段 xstream.registerLocalConverter(Volume.class, "documents", new LocalArrayListConverter(xstream)); //要转换的对象 Volume volume = new Volume(); //创建集合 Collection coll = new ArrayList(); coll.add(1); coll.add(2.123d); coll.add(new Person("张三")); volume.documents.addAll(coll); System.out.println("******序列化******"); //转换XML String xml = xstream.toXML(volume); //输出XML System.out.println(xml); System.out.println("******反序列化******"); Volume v2 = (Volume)xstream.fromXML(xml); for(Object obj:v2.documents){ System.out.println("obj="+obj); } } } abstract class AbstractDocument { String title; } class TextDocument extends AbstractDocument { List chapters = new ArrayList(); } class ScannedDocument { List images = new ArrayList(); } class Volume { List documents = new ArrayList(); }
运行结果:
******序列化****** <volume> <documents>d:\tmp</documents> </volume> ******反序列化****** obj=Person对象的name=张三 obj=Person对象的name=毛毛 obj=Person对象的name=大熊 obj=1 obj=2.123 obj=Person对象的name=张三
相关推荐
在Java开发中,数据序列化和反序列化是一项常见的任务,它允许我们将对象的状态转换为持久化的格式(如XML或JSON),以便存储或传输。XStream是一个强大的库,专门用于XML与Java对象之间的互相转换。这篇博文将深入...
以下是一个简单的示例,演示如何使用XStream进行XML与Java对象的转换: ```java import com.thoughtworks.xstream.XStream; class User { private String name; private int age; // getters and setters ...
XStream是一个轻量级、高性能的库,能够将Java对象序列化为XML,同时也能将XML反序列化回Java对象,实现XML和Java对象的互相转换。 首先,我们需要引入XStream库。在给定的描述中提到了两个依赖文件:xstream-1.3.1...
XStream是一款强大的Java库,主要用于将Java对象序列...在实际开发中,XStream的简单性和灵活性使其成为处理Java对象与XML数据之间转换的首选工具。通过合理配置和使用,可以极大地提高开发效率并简化数据处理流程。
在Java开发中,数据交换和持久化经常涉及到XML与Java对象之间的转换。XStream库提供了一个简单、直观的方式来实现这种转换,使得XML序列化和反序列化变得非常方便。本篇将详细介绍XStream如何处理XML与Java对象的...
为了将一个Java对象转换成XML,首先需要创建该对象实例,然后使用XStream的`toXML()`方法: ```java import com.thoughtworks.xstream.XStream; public class Person { private String name; private int age; ...
XStream 的核心概念是通过自动映射 Java 类和 XML 节点来实现对象和 XML 的转换。它通过反射和自定义转换器机制来完成这一过程。默认情况下,XStream 可以处理大多数标准的 Java 类型,包括基本类型、集合、Map 等。...
在Java编程语言中,XStream库提供了一个简单且强大的机制,用于将Java对象序列化为XML,反之亦然。这使得在存储数据、传输数据或持久化对象时非常方便。本教程将深入探讨XStream库及其在Java中的使用,通过实际的...
XStream通过映射XML节点到Java类的字段来实现对象的序列化和反序列化。这意味着你需要定义一个Java类,该类的字段对应于XML文档中的元素。XStream会自动处理这个映射过程,无需编写复杂的DOM或SAX解析代码。 下面是...
在实际项目中,了解并熟练掌握XStream可以帮助我们更有效地处理Java对象与XML之间的转换,特别是在需要序列化大量数据或者构建RESTful API时。 在提供的压缩包中,`sample.xml`可能是使用XStream序列化后的Java对象...
`XStream` 是一个强大的Java库,它允许我们将Java对象序列化为XML,反之亦然,极大地简化了XML与Java对象之间的转换过程。下面我们将详细探讨`XStream`库的工作原理以及如何使用它来实现XML和Java对象的互换。 首先...
在提供的`AppDemo`文件中,可能包含了一个简单的示例应用,演示了如何在实际项目中使用XStream进行XML和Java对象的转换。通过运行和分析这个例子,你可以更好地理解这一过程,并将其应用到自己的项目中。 总之,...
总之,XStream提供了一种直观且易于使用的机制来处理Java对象与XML之间的转换。结合Android的文件操作,我们可以方便地将数据序列化后存储到外部存储中,以便于后续读取和使用。通过熟练掌握XStream,开发者可以更...
要实现"springMVC整合xStream实现对象和xml转换",我们需要以下步骤: 1. **引入依赖**:在项目的pom.xml文件中,添加XStream库的依赖。 2. **创建Controller**:创建一个SpringMVC Controller类,例如`...
在Android开发中,XML是一种广泛使用的数据存储和交换格式,特别是在序列化对象为持久化格式时。XStream是一个强大的库,它使得Java对象与XML之间的转换变得极其简单。本篇文章将深入探讨如何在Android环境中利用...
Java中的Xstream库是一个强大的工具,它允许程序员方便地将Java对象序列化为XML和从XML反序列化回Java对象。这个过程对于数据交换、持久化或者创建XML配置文件非常有用。Xstream通过使用注解提供了高度的灵活性,...
标题中的“XStream实现Object与XML转换解决方案”指的是一个Java库——XStream,它提供了一种简单的方法来序列化和反序列化Java对象到XML,反之亦然。这个库广泛用于将程序数据保存到XML文件或者从XML数据恢复对象,...