`
sjsky
  • 浏览: 913290 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

XStream序列化JAVA对象为XML以及反序列化

    博客分类:
  • Java
阅读更多
    blog迁移至:http://www.micmiu.com

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("test@test.com");

        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("contact1@test.com");

        ContactBean contact2 = new ContactBean();
        contact2.setPostCode("20002");
        contact2.setTelephone("021-22222222");
        contact2.setMobile("13922222222");
        contact2.setEmail("contact2@test.com");

        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>test@test.com</email>
  </contact>
  <contactArr>
    <michael.xstream.ContactBean>
      <postCode>200011</postCode>
      <telephone>021-11111111</telephone>
      <mobile>13911111111</mobile>
      <email>contact1@test.com</email>
    </michael.xstream.ContactBean>
    <michael.xstream.ContactBean>
      <postCode>20002</postCode>
      <telephone>021-22222222</telephone>
      <mobile>13922222222</mobile>
      <email>contact2@test.com</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:test@test.com
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>test@test.com</email>
  </contact>
  <contactArr>
    <michael.xstream.ContactBean>
      <postCode>200011</postCode>
      <telephone>021-11111111</telephone>
      <mobile>13911111111</mobile>
      <email>contact1@test.com</email>
    </michael.xstream.ContactBean>
    <michael.xstream.ContactBean>
      <postCode>20002</postCode>
      <telephone>021-22222222</telephone>
      <mobile>13922222222</mobile>
      <email>contact2@test.com</email>
    </michael.xstream.ContactBean>
  </contactArr>
</UserBean>


到此测试例子结束,是不是觉得很方便啊,吼吼



转载请注明来自:Michael's blog @ http://sjsky.iteye.com

----------------------------- 分 ------------------------------ 隔 ------------------------------ 线 ------------------------------


4
2
分享到:
评论
4 楼 sjsky 2011-07-20  
ejbtimer 写道
很好很好,
最好再加上对象数组的例子如private ContactBean[] contact;
需要使用
xStream.setMode(XStream.NO_REFERENCES);
这个还是从http://xstream.codehaus.org/index.html上找到的。


我测试过了,对相关代码修改补充好了,好像不需要设置参数mode也可以序列化,不知道你测试时碰到了什么样的问题
3 楼 sjsky 2011-07-20  
ejbtimer 写道
很好很好,
最好再加上对象数组的例子如private ContactBean[] contact;
需要使用
xStream.setMode(XStream.NO_REFERENCES);
这个还是从http://xstream.codehaus.org/index.html上找到的。

这个还真没有测试过,多谢提醒和补充的,下次会补上
2 楼 ejbtimer 2011-07-20  
很好很好,
最好再加上对象数组的例子如private ContactBean[] contact;
需要使用
xStream.setMode(XStream.NO_REFERENCES);
这个还是从http://xstream.codehaus.org/index.html上找到的。
1 楼 madsion8875 2010-10-14  
不错,很好的一个贴子

相关推荐

    使用XStream序列化/反序列化对象

    XStream是一个强大的库,它允许开发者以XML格式进行序列化和反序列化Java对象。在这个场景中,我们将深入探讨如何使用XStream处理对象的序列化和反序列化。 首先,让我们了解什么是XStream。XStream是由Joe Walnes...

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

    在提供的压缩包中,`sample.xml`可能是使用XStream序列化后的Java对象示例,而`src`目录可能包含了相关的Java源代码,供学习和参考。通过研究这些文件,你可以更深入地理解XStream的工作原理和使用方式。

    xstream-1.1.3正反序列化JAVA对象

    标题提到的"xstream-1.1.3正反序列化JAVA对象"是指使用XStream 1.1.3版本来处理Java对象的序列化和反序列化操作。XStream的核心功能在于它可以将复杂的Java对象结构轻松地映射到XML结构上,这使得数据交换和持久化变...

    Xstream_java对象和xml的互相转换

    XStream 是一个强大的 Java 库,它允许程序员轻松地将 Java 对象序列化为 XML,同时也能从 XML 数据中反序列化回原来的 Java 对象。这个功能在数据持久化、网络传输或者配置文件存储等方面非常有用。XStream 的设计...

    XStream对象序列化

    XStream与其他XML序列化工具相比,其主要特点包括: - **字段可见性不敏感**:XStream可以序列化私有字段,而无需暴露getter和setter方法。 - **无需默认构造函数**:对象不需要有无参数的构造函数,XStream可以...

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

    反序列化XML回Java对象的过程则相对简单: ```java // 从XML字符串反序列化回Java对象 Person deserializedPerson = (Person) xstream.fromXML(xml); ``` XStream还提供了许多高级特性,比如自定义字段映射、处理...

    xstream轻松解析xml到java对象

    在IT行业中,XML(eXtensible Markup Language)是一种常用的数据交换格式,广泛应用于系统间的数据传输、配置文件以及序列化。然而,处理XML数据时,解析和转换为可操作的对象是一个常见挑战。这时,XStream库就派...

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

    XStream是一款强大的Java库,主要用于将Java对象序列化为XML,并能从XML反序列化回Java对象。这个功能对于数据存储、网络传输或者XML配置文件的解析非常有用。标题和描述提到的三个JAR文件——xstream-1.3.jar、kxml...

    Java用xStream拼接xml

    Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream是一个开源的Java库,由Johannes Link创建。它提供了简洁、直观的API来处理XML...

    xStream 实现xml与 java对象的转换

    这时,xStream库应运而生,它提供了一个简单、高效的API来实现XML与Java对象之间的序列化和反序列化。 xStream库的核心概念是“映射”,它通过创建一个映射关系,将Java对象与XML元素和属性对应起来。这使得我们...

    XStream <--> Java 对象序列化为 XML 互换

    使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列...

    Bboss和xstream序列化反序列化性能对比1

    在本文中,我们将深入探讨Bboss和Xstream两个序列化和反序列化库在性能方面的差异。这两个库在Java开发中广泛用于将对象转换为XML格式,以便于存储、传输或持久化。以下是对这两个库的详细分析。 首先,Bboss和...

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

    总的来说,XStream是Java开发中处理XML序列化和反序列化的强大工具,其简单易用的API使得XML与Java对象之间的转换变得轻松而高效。通过熟练掌握XStream的使用,开发者可以更好地在Java应用中利用XML进行数据交换和...

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

    5. **反序列化XML**:从XML字符串恢复Java对象同样简单: ```java Person person = (Person) xstream.fromXML(xml); ``` 6. **处理复杂的对象结构**:XStream可以处理嵌套的对象和集合。例如,`Person`类包含一...

    Java实验7 序列化.doc

    Java序列化是将Java对象转换为字节流的过程,以便可以存储在磁盘上或通过网络进行传输。这个过程对于持久化对象数据、跨进程通信和在网络上传输对象非常有用。在Java中,序列化是通过实现`Serializable`接口来完成的...

    XStream测试Demo-xml与java对象的相互转换

    对于反序列化,我们可以使用`fromXML()`方法将XML字符串还原为Java对象: ```java User deserializedUser = (User) xstream.fromXML(xml); ``` XStream还提供了自定义序列化和反序列化行为的能力。例如,你可以...

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

    接下来,如果要从XML字符串反序列化回Java对象,可以使用XStream的`fromXML()`方法: ```java Person deserializedPerson = (Person) xstream.fromXML(xml); ``` XStream还可以处理复杂的对象结构,包括嵌套的对象...

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

    这样,当我们使用Xstream序列化一个`Person`对象时,会得到如下的XML: ```xml &lt;firstName&gt;John &lt;lastName&gt;Doe ``` 为了序列化Java对象,我们可以创建一个Xstream实例并调用`toXML()`方法: ```java Person ...

    xstream 1.3.1.jar bean对象转换为xml

    **反序列化XML到Bean对象:** XStream也支持将XML数据恢复为Java对象,这对于从XML文件或网络响应中加载数据非常有用。 1. **设置别名**:与序列化相同,你需要设置XML标签的别名,以便XStream知道如何映射回正确的...

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

    总的来说,“使用XStream是实现XML与Java对象的转换(6)--持久化”这个主题涵盖了如何使用XStream进行对象的持久化操作,包括创建XStream实例、序列化和反序列化,以及文件I/O操作。了解这些知识点对于需要在Java项目...

Global site tag (gtag.js) - Google Analytics