简单的讲,XStream 涉及的就五个知识点:详情参考 官网

混叠,注解,转换器,对象流和操作json!

下面就用几个简单的例子来实现上述五个知识点!

基本步骤:

第1步:创建XStream对象。

通过它传递一个StaxDriver创建XStream对象。StaxDriver使用SAX解析器(可从Java6),一个快速的XML解析器。

XStream xstream = new XStream(new StaxDriver());

第2步:序列化对象到XML。

使用toXML() 方法来获取对象的XML字符串表示。

//Object to XML ConversionString xml = xstream.toXML(student);

第3步:反序列化XML获得对象。

使用 fromXML()方法来从XML对象。

//XML to Object Conversion Student student1 = (Student)xstream.fromXML(xml);

例一:

通过实体生成xml

);

        Address address=);
        student.setAddress(address);
        );
        return student;
    }
}

输出上例相同的结果!

对象流

XStream提供java.io.ObjectInputStream和java.io.ObjectOutputStream替代实现,使对象流可以被序列化或XML序列化。当大对象集要被处理,保持在存储器中的一个对象,这是特别有用的。

语法 : createObjectOutputStream()

ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(new FileOutputStream("test.txt"));

语法 :createObjectInputStream()

ObjectInputStream objectInputStream = xstream.createObjectInputStream(new FileInputStream("test.txt"));

对象流测试代码

public class XStream_test_5 {
    public static void main(String... args) {
        XStream mXStream = new XStream(new DomDriver());
        mXStream.autodetectAnnotations(true);
        Student student1=new Student("ma0","ss0");
        Student student2=new Student("ma1","ss1");
        Student student3=new Student("ma2","ss2");
        Student student4=new Student("ma3","ss3");

        try {
            ObjectOutputStream os=mXStream.createObjectOutputStream(new FileOutputStream("text.txt"));
            os.writeObject(student1);
            os.writeObject(student2);
            os.writeObject(student3);
            os.writeObject(student4);
            os.writeObject("Hello World!");
            os.close();

            ObjectInputStream in=mXStream.createObjectInputStream(new FileInputStream("text.txt"));
            Student student5= (Student) in.readObject();
            Student student6= (Student) in.readObject();
            Student student7= (Student) in.readObject();
            Student student8= (Student) in.readObject();
            String txt= (String) in.readObject();
            System.out.println(student5);
            System.out.println(student6);
            System.out.println(student7);
            System.out.println(student8);
            System.out.println(txt);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

}

@XStreamAlias("student")
public class Student {
    private String firstName;
    private String lastName;

    public Student(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Student{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }
}

结果如下 :

Json操作

实体类,还是用上面的Student类

测试代码:

public class XStream_test_6 {
    public static void main(String... args) {
        XStream xStream=new XStream(new JsonHierarchicalStreamDriver(){
            @Override
            public HierarchicalStreamWriter createWriter(Writer out) {
                return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
            }
        });

        Student student=new Student("ss","ssss");
        xStream.setMode(XStream.NO_REFERENCES);
        xStream.alias("student",Student.class);
        System.out.println(xStream.toXML(student));
    }
}

结果如下:

通过上述例子看XStream在解释xml是非常的方便,转换器主要是能改变xml文件的字段名

更多详解,请看官网

综合例子:

解释如下xml文件:为方便就另保存在 xml.txt文件中

<?xml version="1.0" encoding="utf-8"?>
<alipay>
  <is_success>T</is_success>
  <request>
    <param name="_input_charset">utf-8</param>
    <param name="service">single_trade_query</param>
    <param name="partner">20889010000000</param>
    <param name="out_trade_no">7_20130223150319_26</param>
  </request>
  <response>
    <trade>
      <total_fee>0.01</total_fee>
      <trade_no>2013022356736989</trade_no>
      <trade_status>TRADE_SUCCESS</trade_status>
      <use_coupon>F</use_coupon>
    </trade>
  </response>
  <sign>6c472babf7bd98ascb97fee1666a3303</sign>
  <sign_type>MD5</sign_type>
</alipay>

写实体如下

@XStreamAlias("alipay")
public class Alipay {
    private String is_success;
    private String sign;
    private String sign_type;

    public Request request;
    public Response response;

    @Override
    public String toString() {
        return "Alipay{" +
                "is_success='" + is_success + '\'' +
                ", sign='" + sign + '\'' +
                ", sign_type='" + sign_type + '\'' +
                ", request=" + request +
                ", response=" + response +
                '}';
    }
}
@XStreamAlias("request")
class Request{
    // @XStreamImplicit(itemFieldName = "param")
    @XStreamImplicit(itemFieldName = "param")
    public List<Param> params;

    public Request(List<Param> params) {
        this.params = params;
    }

    @Override
    public String toString() {
        return "Request{" +
                "param=" + params +
                '}';
    }
}
@XStreamAlias("trade")
class Trade{
    private String total_fee;
    private String trade_no;
    private String trade_status;
    private String use_coupon;

    @Override
    public String toString() {
        return "Trade{" +
                "total_fee='" + total_fee + '\'' +
                ", trade_no='" + trade_no + '\'' +
                ", trade_status='" + trade_status + '\'' +
                ", use_coupon='" + use_coupon + '\'' +
                '}';
    }
}

/**
 * ToAttributedValueConverter 取得value值
 * 解释格式 如 <param name="_input_charset">utf-8</param>
 * 用@XStreamConverter(value=ToAttributedValueConverter.class, strings={"param"})
 * strings={"param"}中的param来接收xml中param中的值utf-8
 */
//@XStreamAlias("param")
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"param"})
class Param{
    @XStreamAsAttribute()
    private String name;

    public String param;

    @Override
    public String toString() {
        return "Param{" +
                "name='" + name + '\'' +
                ", param='" + param + '\'' +
                '}';
    }
}

@XStreamAlias("response")
class  Response{
    private Trade trade;

    @Override
    public String toString() {
        return "Response{" +
                "trade=" + trade +
                '}';
    }
}

测试代码如下:

public class XStrem_alipay {
    public static void main(String... args) {
        try {
            Alipay alipay= XmlUtil.toBeanFromFile("xml.txt",Alipay.class);
            System.out.println(alipay);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意:toBeanFromFile是把xml转换成实体对象的方法,比较简单,综合来看XStream来解释xml是非常的方便,其中要注意的地方是这种 <param name="_input_charset">utf-8</param>

要使用转换器来获取param中的Value,还好框架已实现了,只要在类中加上@XStreamConverter(value=ToAttributedValueConverter.class, strings={"param"})
该注解,一切都变得很容易!!

项目代码

XStream简单入门的更多相关文章

  1. JAVA Bean和XML之间的相互转换 - XStream简单入门

    JAVA Bean和XML之间的相互转换 - XStream简单入门 背景介绍 XStream的简介 注解简介 应用实例 背景介绍 我们在工作中经常 遇到文件解析为数据或者数据转化为xml文件的情况, ...

  2. 用IntelliJ IDEA创建Gradle项目简单入门

    Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...

  3. [原创]MYSQL的简单入门

    MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...

  4. Okio 1.9简单入门

    Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...

  5. emacs最简单入门,只要10分钟

    macs最简单入门,只要10分钟  windwiny @2013    无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...

  6. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  7. Docker 简单入门

    Docker 简单入门 http://blog.csdn.net/samxx8/article/details/38946737

  8. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

  9. git简单入门

    git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...

随机推荐

  1. O365(世纪互联)SharePoint 之文档库使用小记

    前言 当O365越来越流行的时候,大家往往更多使用的是传统的Office功能,有太少订阅用户能触及到O365的一个非常棒的功能,叫做SharePoint online. 下面,我们就以图文并茂的方式, ...

  2. User Get 'Access Denied' with Excel Service WebPart

    用户可以访问网站,并且具有相应的访问权限. 用户尝试了其他浏览器和IE的其他版本. 解决: 将用户添加到 ‘Excel Services Views’ 这个SharePoint组就OK了.

  3. [转]给 C# 开发者的代码审查清单

    这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...

  4. Menu创建菜单

    菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu),今天这讲是O ...

  5. Android UI ListView的使用

    一.ListView的理解  1.什么ListView?   一种用来显示多个可滑动项(Item)列表的的ViewGroup 需要使用Adapter将集合数据和每一个Item所对应的布局动态适配到Li ...

  6. CSS3-03 样式 2

    前言 在上一篇的博客中,阐述了 CSS 盒模型中的 Margin.Border.Padding 三个样式.但是总觉得,这些东西好像是 HTML 元素的包装样式,真正的要点是 HTML 元素(即:盒模型 ...

  7. ant+findbugs 扫描代码生成报告

    1. 下载安装ant.findbugs 下载ant.findbugs最新压缩包解压到本地磁盘合适位置,比如: D:\Program Files\apache-ant-1.9.7 D:\Program ...

  8. [MySQL Reference Manual] 8 优化

    8.优化 8.优化 8.1 优化概述 8.2 优化SQL语句 8.2.1 优化SELECT语句 8.2.1.1 SELECT语句的速度 8.2.1.2 WHERE子句优化 8.2.1.3 Range优 ...

  9. MongoDB学习笔记~MongoDBRepository仓储的实现

    回到目录 仓储大叔,只要是持久化的东西,都要把它和仓储撤上关系,为啥,为的是开发人员在使用时统一,高可用及方便在各种方式之间实现动态的切换,如ef与redis和mongoDB的切换,你完成可以通过IR ...

  10. android 让一个Activity停留几秒后再跳转

    有时候我们需要在某个 Activity 停留几秒种,然后再跳到下一个 Activity.那么这个怎么实现呢? 一个方法是可以使用 Thread 的 sleep 函数,这个我们在 用Handler实现线 ...