java 序列化反序列化xml【使用XStream類庫】

XStream是一個簡單的類庫,可以序列化對象到xml,還可以將xml還原爲對象。
XStream官網: http://xstream.codehaus.org/ 
附件提供XStream和xpp3相關的jar下載: 
xstream-1.2.2.jar 
xpp3-1.1.3.3_min.jar 
爲了使用XStream,需要對其初始化,初始化方法有兩種: 

· XStream xstream = new XStream();           這種方式的初始化需要xpp3-[version].jar的支持。xpp是一個快速解析XML文件的解析器。

· XStream xstream = new XStream(new DomDriver()); XStream xStream = new XStream(new DomDriver("utf-8"))           這種方式不需要 XPP3.jar的支持,它是使用標準的JAXP DOM來解析它


應:ejbtimer的要求增加了數組對象的序列化測試,不過我測試時沒有設置mode參數也可以正常序列化。
同時這裏對mode參數做個簡單的說明: 
在XStream序列化或反序列化對象時,它會創建兩個類MarshallingContext和UnmarshallingContext,由它們來處理數據,以及委派合適的轉換器。XStream提供了三對上下文的缺省實現,它們之間有着細微的差別。缺省值可以通過方法XStream.setMode()來改變,需要傳遞下面參數中的一個: 

· XStream.XPATH_RELATIVE_REFERENCES:(缺省)通過XPath引用來標識重複的引用,使用相對路徑表示。

· XStream.XPATH_ABSOLUTE_REFERENCES:通過XPath引用來標識重複的引用,使用絕對路徑表示。

· XStream.ID_REFERENCES:使用ID引用來標識重複的引用。在一些場合(手寫XML時),將會更易於操作

· XStream.NO_REFERENCES:這種情況將失去對圖形對象的支持,僅把對象看作爲樹型結構。重複的引用被視作兩個不同的對象,循環引用會導致異常產生。相對於上面兩種模式,這種模式速度會更快,佔用內存會更

下面簡單的例子包括三個類:UserBean.java,ContactBean.java,XstreamTestMain.java代碼如下: 
xstream測試類: XstreamTestMain.java


package michael.xstream;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
 
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
 
/**
 * Xtream 序列化及反序列化
 * @blog http://sjsky.iteye.com
 * @author Michael
 */
public class XtreamTestMain {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
 
        UserBean userBean = initBean();
        // 依懶xpp解析器
        // XStream xStream = new XStream();
        // 運用標準的DOM解析器
        // XStream xStream = new XStream(new DomDriver());
        // 指定編碼格式
        XStream xStream = new XStream(new DomDriver("utf-8"));
 
        // xStream.setMode(XStream.NO_REFERENCES);
 
        // 直接指定修改生成XML的節點名稱
        xStream.alias("UserBean", UserBean.class);
        String xml = xStream.toXML(userBean);
        System.out.println("BEAN轉化爲XML 字符串-----------------------------");
        System.out.println(xml);
 
        System.out.println("XML轉化爲BEAN-----------------------------");
        UserBean parseBean = (UserBean) xStream.fromXML(xml);
        System.out.println("userName:" + parseBean.getUserName());
        System.out.println("age:" + parseBean.getAge());
        System.out.println("birthday:" + parseBean.getBirthday());
        for (String str : parseBean.getAddresList()) {
            System.out.println("addres:" + str);
        }
        for (Entry<String, String> entry : parseBean.getNickNameMap()
                .entrySet()) {
            System.out.println("nick name:" + entry.getKey() + "<->"
                    + entry.getValue());
        }
        ContactBean contact = parseBean.getContact();
        System.out.println("postcode:" + contact.getPostCode());
        System.out.println("telephone:" + contact.getTelephone());
        System.out.println("mobile:" + contact.getMobile());
        System.out.println("email:" + contact.getEmail());
 
        System.out.println("BEAN轉化爲XML文件-----------------------------");
        try {
            FileOutputStream fos = new FileOutputStream("d:/test/userbean.xml");
            xStream.toXML(userBean, fos);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
 
        System.out.println("XML文件轉化爲BEAN-----------------------------");
        UserBean parseFileBean = new UserBean();
        try {
            FileInputStream fis = new FileInputStream("d:/test/userbean.xml");
 
            parseFileBean = (UserBean) xStream.fromXML(fis, parseFileBean);
            System.out.println("parseFileBean->" + parseFileBean);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
 
    }
 
    /**
     * @return test bean
     */
    private static UserBean initBean() {
        ContactBean contact = new ContactBean();
        contact.setPostCode("200000");
        contact.setTelephone("021-88888888");
        contact.setMobile("1891800xxxx");
        contact.setEmail("[email protected]");
 
        List<String> addressList = new ArrayList<String>();
        addressList.add("上海楊浦");
        addressList.add("江蘇蘇州");
 
        Map<String, String> nickNameMap = new HashMap<String, String>();
        nickNameMap.put("大大", "小小");
        nickNameMap.put("老公", "老婆");
 
        UserBean userBean = new UserBean();
        userBean.setUserName("michael");
        userBean.setAge(26);
        userBean.setBirthday(new Date());
        userBean.setAddresList(addressList);
        userBean.setNickNameMap(nickNameMap);
        userBean.setContact(contact);
 
        ContactBean contact1 = new ContactBean();
        contact1.setPostCode("200011");
        contact1.setTelephone("021-11111111");
        contact1.setMobile("13911111111");
        contact1.setEmail("[email protected]");
 
        ContactBean contact2 = new ContactBean();
        contact2.setPostCode("20002");
        contact2.setTelephone("021-22222222");
        contact2.setMobile("13922222222");
        contact2.setEmail("[email protected]");
 
        ContactBean[] contactArr = new ContactBean[] { contact1, contact2 };
        userBean.setContactArr(contactArr);
        return userBean;
    }
 
}
 

測試UserBean:UserBean.java
package michael.xstream;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * @author Michael
 */
public class UserBean {
 
    /**
     * 用戶名稱
     */
    private String userName;
 
    /**
     * 年齡
     */
    private Integer age;
 
    /**
     * 出生日期
     */
    private Date birthday;
 
    /**
     * 地址
     */
    private List<String> addresList = new ArrayList<String>();
 
    /**
     * 暱稱
     */
    private Map<String, String> nickNameMap = new HashMap<String, String>();
 
    /**
     * 聯繫方式Bean
     */
    private ContactBean contact;
 
    /**
     * 測試對象數組
     */
    private ContactBean[] contactArr;
 
    /**
     * @return the userName
     */
    public String getUserName() {
        return userName;
    }
 
    /**
     * @return the age
     */
    public Integer getAge() {
        return age;
    }
 
    /**
     * @return the birthday
     */
    public Date getBirthday() {
        return birthday;
    }
 
    /**
     * @return the addresList
     */
    public List<String> getAddresList() {
        return addresList;
    }
 
    /**
     * @return the nickNameMap
     */
    public Map<String, String> getNickNameMap() {
        return nickNameMap;
    }
 
    /**
     * @return the contact
     */
    public ContactBean getContact() {
        return contact;
    }
 
    /**
     * @param pUserName the userName to set
     */
    public void setUserName(String pUserName) {
        userName = pUserName;
    }
 
    /**
     * @param pAge the age to set
     */
    public void setAge(Integer pAge) {
        age = pAge;
    }
 
    /**
     * @param pBirthday the birthday to set
     */
    public void setBirthday(Date pBirthday) {
        birthday = pBirthday;
    }
 
    /**
     * @param pAddresList the addresList to set
     */
    public void setAddresList(List<String> pAddresList) {
        addresList = pAddresList;
    }
 
    /**
     * @param pNickNameMap the nickNameMap to set
     */
    public void setNickNameMap(Map<String, String> pNickNameMap) {
        nickNameMap = pNickNameMap;
    }
 
    /**
     * @param pContact the contact to set
     */
    public void setContact(ContactBean pContact) {
        contact = pContact;
    }
 
    /**
     * @return the contactArr
     */
    public ContactBean[] getContactArr() {
        return contactArr;
    }
 
    /**
     * @param pContactArr the contactArr to set
     */
    public void setContactArr(ContactBean[] pContactArr) {
        contactArr = pContactArr;
    }
 
}
 

測試ContactBean :ContactBean.java
package com.test;
/**
 * @author Michael
 */
public class ContactBean {
 
    /**
     * 郵編
     */
    private String postCode;
 
    /**
     * 電話
     */
    private String telephone;
 
    /**
     * 手機
     */
    private String mobile;
 
    /**
     * email
     */
    private String email;
 
    /**
     * @return the postCode
     */
    public String getPostCode() {
        return postCode;
    }
 
    /**
     * @return the telephone
     */
    public String getTelephone() {
        return telephone;
    }
 
    /**
     * @return the mobile
     */
    public String getMobile() {
        return mobile;
    }
 
    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }
 
    /**
     * @param pPostCode the postCode to set
     */
    public void setPostCode(String pPostCode) {
        postCode = pPostCode;
    }
 
    /**
     * @param pTelephone the telephone to set
     */
    public void setTelephone(String pTelephone) {
        telephone = pTelephone;
    }
 
    /**
     * @param pMobile the mobile to set
     */
    public void setMobile(String pMobile) {
        mobile = pMobile;
    }
 
    /**
     * @param pEmail the email to set
     */
    public void setEmail(String pEmail) {
        email = pEmail;
    }
}
 

運行測試代碼,打印結果如下:
引用

BEAN轉化爲XML 字符串-----------------------------
<UserBean>
  <userName>michael</userName>
  <age>26</age>
  <birthday>2011-07-20 23:33:32.969 CST</birthday>
  <addresList>
    <string>上海楊浦</string>
    <string>江蘇蘇州</string>
  </addresList>
  <nickNameMap>
    <entry>
      <string>老公</string>
      <string>老婆</string>
    </entry>
    <entry>
      <string>大大</string>
      <string>小小</string>
    </entry>
  </nickNameMap>
  <contact>
    <postCode>200000</postCode>
    <telephone>021-88888888</telephone>
    <mobile>1891800xxxx</mobile>
    <email>[email protected]</email>
  </contact>
  <contactArr>
    <michael.xstream.ContactBean>
      <postCode>200011</postCode>
      <telephone>021-11111111</telephone>
      <mobile>13911111111</mobile>
      <email>[email protected]</email>
    </michael.xstream.ContactBean>
    <michael.xstream.ContactBean>
      <postCode>20002</postCode>
      <telephone>021-22222222</telephone>
      <mobile>13922222222</mobile>
      <email>[email protected]</email>
    </michael.xstream.ContactBean>
  </contactArr>
</UserBean>
XML轉化爲BEAN-----------------------------
userName:michael
age:26
birthday:Wed Jul 20 23:33:32 CST 2011
addres:上海楊浦
addres:江蘇蘇州
nick name:老公<->老婆
nick name:大大<->小小
postcode:200000
telephone:021-88888888
mobile:1891800xxxx
email:[email protected]
BEAN轉化爲XML文件-----------------------------
XML文件轉化爲BEAN-----------------------------
parseFileBean->michael.xstream.UserBean@bf7190

生成的XML文件userbean.xml:
<UserBean>
  <userName>michael</userName>
  <age>26</age>
  <birthday>2011-07-20 23:33:32.969 CST</birthday>
  <addresList>
    <string>上海楊浦</string>
    <string>江蘇蘇州</string>
  </addresList>
  <nickNameMap>
    <entry>
      <string>老公</string>
      <string>老婆</string>
    </entry>
    <entry>
      <string>大大</string>
      <string>小小</string>
    </entry>
  </nickNameMap>
  <contact>
    <postCode>200000</postCode>
    <telephone>021-88888888</telephone>
    <mobile>1891800xxxx</mobile>
    <email>[email protected]</email>
  </contact>
  <contactArr>
    <michael.xstream.ContactBean>
      <postCode>200011</postCode>
      <telephone>021-11111111</telephone>
      <mobile>13911111111</mobile>
      <email>[email protected]</email>
    </michael.xstream.ContactBean>
    <michael.xstream.ContactBean>
      <postCode>20002</postCode>
      <telephone>021-22222222</telephone>
      <mobile>13922222222</mobile>
      <email>[email protected]</email>
    </michael.xstream.ContactBean>
  </contactArr>
</UserBean>


到此測試例子結束,是不是覺得很方便啊,吼吼 





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章