`

使用XStream是实现XML与Java对象的转换(6)--持久化

阅读更多

九、持久化

在第八节的示例中,当我们操作一组对象时,我们可以指定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=张三

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2
0
分享到:
评论

相关推荐

    使用XStream是实现XML与Java对象的转换(4)--转换器

    在Java开发中,数据序列化和反序列化是一项常见的任务,它允许我们将对象的状态转换为持久化的格式(如XML或JSON),以便存储或传输。XStream是一个强大的库,专门用于XML与Java对象之间的互相转换。这篇博文将深入...

    xstream轻松解析xml到java对象

    以下是一个简单的示例,演示如何使用XStream进行XML与Java对象的转换: ```java import com.thoughtworks.xstream.XStream; class User { private String name; private int age; // getters and setters ...

    好用的xStream XML和JAVA对象互相转换的简单示例

    XStream是一个轻量级、高性能的库,能够将Java对象序列化为XML,同时也能将XML反序列化回Java对象,实现XML和Java对象的互相转换。 首先,我们需要引入XStream库。在给定的描述中提到了两个依赖文件:xstream-1.3.1...

    XStream在Java对象和XML之间相互转换

    XStream是一款强大的Java库,主要用于将Java对象序列...在实际开发中,XStream的简单性和灵活性使其成为处理Java对象与XML数据之间转换的首选工具。通过合理配置和使用,可以极大地提高开发效率并简化数据处理流程。

    com.thoughtworks.xstream.XStream操作XML和java对象的一些用法

    在Java开发中,数据交换和持久化经常涉及到XML与Java对象之间的转换。XStream库提供了一个简单、直观的方式来实现这种转换,使得XML序列化和反序列化变得非常方便。本篇将详细介绍XStream如何处理XML与Java对象的...

    使用xstream进行java类与xml文件互转解析--代码

    为了将一个Java对象转换成XML,首先需要创建该对象实例,然后使用XStream的`toXML()`方法: ```java import com.thoughtworks.xstream.XStream; public class Person { private String name; private int age; ...

    Xstream_java对象和xml的互相转换

    XStream 的核心概念是通过自动映射 Java 类和 XML 节点来实现对象和 XML 的转换。它通过反射和自定义转换器机制来完成这一过程。默认情况下,XStream 可以处理大多数标准的 Java 类型,包括基本类型、集合、Map 等。...

    xstream对象与xml转换

    在Java编程语言中,XStream库提供了一个简单且强大的机制,用于将Java对象序列化为XML,反之亦然。这使得在存储数据、传输数据或持久化对象时非常方便。本教程将深入探讨XStream库及其在Java中的使用,通过实际的...

    XStream解析xml 转换成对象案例

    XStream通过映射XML节点到Java类的字段来实现对象的序列化和反序列化。这意味着你需要定义一个Java类,该类的字段对应于XML文档中的元素。XStream会自动处理这个映射过程,无需编写复杂的DOM或SAX解析代码。 下面是...

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

    在实际项目中,了解并熟练掌握XStream可以帮助我们更有效地处理Java对象与XML之间的转换,特别是在需要序列化大量数据或者构建RESTful API时。 在提供的压缩包中,`sample.xml`可能是使用XStream序列化后的Java对象...

    xml 与java 对象转换

    `XStream` 是一个强大的Java库,它允许我们将Java对象序列化为XML,反之亦然,极大地简化了XML与Java对象之间的转换过程。下面我们将详细探讨`XStream`库的工作原理以及如何使用它来实现XML和Java对象的互换。 首先...

    XML转换为JAVA对象的方法

    在提供的`AppDemo`文件中,可能包含了一个简单的示例应用,演示了如何在实际项目中使用XStream进行XML和Java对象的转换。通过运行和分析这个例子,你可以更好地理解这一过程,并将其应用到自己的项目中。 总之,...

    使用XStream, java Object 与xml之间的转换,以及写入SD卡

    总之,XStream提供了一种直观且易于使用的机制来处理Java对象与XML之间的转换。结合Android的文件操作,我们可以方便地将数据序列化后存储到外部存储中,以便于后续读取和使用。通过熟练掌握XStream,开发者可以更...

    springMVC整合xStream实现对象和xml转换

    要实现"springMVC整合xStream实现对象和xml转换",我们需要以下步骤: 1. **引入依赖**:在项目的pom.xml文件中,添加XStream库的依赖。 2. **创建Controller**:创建一个SpringMVC Controller类,例如`...

    android XMl 解析神奇xstream 二: 把对象转换成xml

    在Android开发中,XML是一种广泛使用的数据存储和交换格式,特别是在序列化对象为持久化格式时。XStream是一个强大的库,它使得Java对象与XML之间的转换变得极其简单。本篇文章将深入探讨如何在Android环境中利用...

    java 利用Xstream注解生成和解析xml

    Java中的Xstream库是一个强大的工具,它允许程序员方便地将Java对象序列化为XML和从XML反序列化回Java对象。这个过程对于数据交换、持久化或者创建XML配置文件非常有用。Xstream通过使用注解提供了高度的灵活性,...

    XStream实现Object与XML转换解决方案

    标题中的“XStream实现Object与XML转换解决方案”指的是一个Java库——XStream,它提供了一种简单的方法来序列化和反序列化Java对象到XML,反之亦然。这个库广泛用于将程序数据保存到XML文件或者从XML数据恢复对象,...

Global site tag (gtag.js) - Google Analytics