1. 程式人生 > >使用XStream是實現XML與Java物件的轉換(6)--持久化

使用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個檔案[email protected][email protected][email protected]。這3個檔案就是我們儲存的3個Person物件,他們的內容分別是:

[email protected]檔案:

<cn.tjpu.zhw.xml.xstream6.Person>
  <name>張三</name>
</cn.tjpu.zhw.xml.xstream6.Person>

[email protected]檔案

<cn.tjpu.zhw.xml.xstream6.Person>
  <name>毛毛</name>
</cn.tjpu.zhw.xml.xstream6.Person>

[email protected]檔案:

<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=張三

相關推薦

使用XStream實現XMLJava物件轉換(6)--持久化

九、持久化 在第八節的示例中,當我們操作一組物件時,我們可以指定Writer、OutputStream來寫出序列化後的XML資料,我們還可以指定Reader、InputStream來讀取序列化後的XML資料。當我們需要寫出和讀取檔案時都需要指定輸入輸出流,並且需要明確的呼叫輸入輸出方法來實現Java物件的序

使用XStream實現XMLJava物件轉換(2)--別名

五、使用別名(Alias) 首先,有這樣一段Java程式碼: import java.util.ArrayList; import java.util.List; import com.thoughtworks.xstream

XStream實現xmljava物件之間的互相轉換(包括對屬性,別名,下劃線_的處理),同理JSON也可以

首先去官網下載響應JAR包 最少需要兩個jar包,一個xstream.jar,一個是xmlpull.jar 首先來看下java物件到xml的轉換 package xml; class PhoneNumber { private int code;

使用XStream實現XMLJava對象的轉換(6)--持久化

light 自己的 map stc title 指定 reg 對象 框架 九、持久化 在第八節的示例中,當我們操作一組對象時,我們可以指定Writer、OutputStream來寫出序列化後的XML數據,我們還可以指定Reader、InputStream來讀取序列化後的XM

使用XStream實現XMLJava對象的轉換(2)--別名

name have ret lis sea sil 數組 ttr auth 五、使用別名(Alias) 首先,有這樣一段Java代碼: Java代碼 import java.util.ArrayList; import java.util.List;

使用XStream實現XMLJava對象的轉換(5)--Object Stream

控制 () oid dex 關閉 ava -o setname otf 八,Object Stream 之前的例子我們都是直接輸出Xml成為String類型或者從String中獲得並解析Xml,現在我們要處理輸入流和輸出流! 1,輸出流(ObjectOutputStrea

xstream--xml工具類--java物件轉換JSONObject、xmljava物件互轉

工作環境: myeclipse2013、jdk1.8、fastjson1.1.41、xstream1.4.3 import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Writer;

JAVA 實現XMLJSON 相互轉換

tst throws light getc con parent urn In 工作 原文地址https://blog.csdn.net/congcong68/article/details/39029907 在工作中,經常碰到XML轉為JSON或者JSON轉為XML,在這

Java實現xmljson互相轉換

看到別人發的,感覺不錯,待驗證1.第一種方法(個人實現的)使用JSON-JAVA提供的方法,之前一直使用json-lib提供的方法轉json,後來發現了這個開源專案,覺得用起來很不錯,並且可以修改XML.java中的parse方法滿足自己的轉換需要。(1)首先去git下載所需

JAXB實現XMLjava物件互轉以及soapXml和物件互轉需要注意的地方

public class JaxbXmlUtil { private static final String DEFAULT_ENCODING = "UTF-8"; /** * pojo轉換成xml 預設編碼UTF-8 */ public static

xmljava物件對映

JAXB提供了XML到java物件(類)之間的相互對映(轉換),我們可以利用JAXB來消除繁瑣的XML解析工作。 下面是引用oracle網站中有關jaxb的一句話。 Now developers have another Java API at their disposal that can make i

jsonJava物件 轉換的幾種方法

package com.yoyohr.bi.bean; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonParseExcepti

xmljava物件之間的相互轉化

Java和xml的互相轉換,依靠強大的JAXBContext可以輕鬆實現。 下面通過一個簡單案例學習一下JAXBContext 首先準備好一個JavaBean供實驗: 注意 1、類檔案註解:@XmlRootElement不可缺少 2、2個Student的構造方法不能少

XStream輕鬆轉換xmljava物件

首先引入所需的jar: xstream-1.4.9、xpp3_min-1.1.4c、dom4j-1.6.1, 或用maven管理jar包時在pom.xml中新增: <!-- https://mvnrepository.com/artifact/com.thought

JAXB實現xml物件互相轉換

不需要引入任何外部jar包,JAXB自jdk1.5就已被整合,jdk1.7已升級為JAXB2。 1.xml報文 <?xml version="1.0" encoding="UTF-8"?> <root xmlns="urn:iso:std:iso:20022:tec

java xml實體物件 互相轉換

本文轉載至:http://blog.csdn.net/sd4015700/article/details/39474893 最近在專案中一直出現Java物件和XML之間的相互轉換,一開始由於專案很龐大,我又是臨時排程過去,導致在按照專案組長的要求進行寫程式碼的同時,總是在這塊雲裡霧裡,最近才慢慢

Json——使用Json jar包實現Json字串Java物件或集合之間的互相轉換

        總結一下利用Json相關jar包實現Java物件和集合與Json字串之間的互相轉換:        1、建立的User類:package com.ghj.packageofdomain; public class User { private int

JAXBContext轉換包含集合屬性的xmljava集合物件Demo

核心類: package com.jaxb; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; impo

XStream實現javabeanxml之間相互轉換

XStream是thoughtworks公司釋出的一個簡單的Java類庫,用於將JavaBean序列化為XML,並且能夠將XML檔案反向轉換為JavaBean. 例項: user.java impor

JSONJava物件的互相轉換

JSON與Java物件的互相轉換 例一(單個物件進行賦值): @RequestMapping("test1.do") @ResponseBody public JSONObject test1(HttpServletRequest request, HttpServletResponse