XStream的简单使用

XStream的简单使用

参考

简单介绍

  • XStream是一个简单的将javabean转换为XML形式的框架,非常的简单方便,同时对于注解也是支持的,也是很简单!

实战

依赖
<dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.4.9</version>
</dependency>
下面的这个依赖之前介绍过!
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.6</version>
</dependency>
第一个例子
package test;
import com.thoughtworks.xstream.XStream;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;

/**
 * Created by wangji on 2017/3/20.
 */

@Slf4j
@Data
@Accessors(chain = true)
public class Person   {
    private String name;
    private String old;
    public static void main(String[] args) {
        XStream xstream = new XStream();
        Person person = new Person().setOld("old").setName("name");
        String xml = xstream.toXML(person);
        log.info(xml);
    }
}

输出结果:

<test.Person>//类名称,要想从新命名可以的
  <name>name</name>
  <old>old</old>
</test.Person>
从新命名包名称
@Slf4j
@Data
@Accessors(chain = true)
public class Person   {
    private String name;
    private String old;
    public static void main(String[] args) {
        XStream xStream = new XStream();
        Person person = new Person().setOld("old").setName("name");
        xStream.alias("package",Person.class);//重新命名类
        xStream.aliasField("nameString",Person.class,"name");//为类的字段重新命名
        String xml = xStream.toXML(person);
        log.info(xml);
    }
}

输出结果:

<package>
  <nameString>name</nameString>
  <old>old</old>
</package>

除了这个还有这个!
xstream.omitField(Person.class, “friends”);把字段节点隐藏
Xstream.addImplicitCollection()省略集合根节点,看参考的文档

Xstream注解

一般的注解
package test;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;

/**
 * Created by wangji on 2017/3/23.
 */
@Data
@Accessors(chain = true)
@Slf4j
@XStreamAlias("student-ww")
public class Student {
    @XStreamAlias("name-ww")
    private String name;
    @XStreamAlias("old-ww")
    private String old;

    public static void main(String[] args) {
        XStream xstream = new XStream();
        xstream.processAnnotations(Student.class);
        Student student = new Student().setOld("old").setName("name");
        log.info(xstream.toXML(student));
    }
}

输出结果:

<student-ww>
  <name-ww>name</name-ww>
  <old-ww>old</old-ww>
</student-ww>

省略集合根节点:@XStreamImplicit
隐藏字段:@XStreamOmitField

设置转换器

@XStreamConverter(),转换器的意思就是在输出前做个处理。

@Data
@Accessors(chain = true)
@Slf4j
@XStreamAlias("student-ww")
public class Student {
    @XStreamAlias("name-ww")
    private String name;

    @XStreamAlias("old-ww")
    private String old;

    @XStreamConverter(value=BooleanConverter.class,booleans={false},strings={"男","女"})
    private boolean sex;


    public static void main(String[] args) {
        XStream xstream = new XStream();
        xstream.processAnnotations(Student.class);
        Student student = new Student().setOld("old").setName("name").setSex(true);
        log.info(xstream.toXML(student));
    }
}

输出结果:

 <student-ww>
  <name-ww>name</name-ww>
  <old-ww>old</old-ww>
  <sex></sex>
</student-ww>

自定义一个转换器

package test;

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;

/**
 * Created by wangji on 2017/3/23.
 */
public class StudentConvert implements Converter {
    //定义转换器能转换的JavaBean类型
    public boolean canConvert(Class aClass) {
        return aClass.isAssignableFrom(Student.class);
    }
   把对象序列化成XML
    public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext marshallingContext) {
        Student student = (Student) value;
        writer.startNode("姓名");
        writer.setValue(student.getName());
        writer.endNode();
        writer.startNode("年龄");
        writer.setValue(student.getOld()+"");
        writer.endNode();
        writer.startNode("转换器");
        writer.setValue("自定义的转换器");
        writer.endNode();
    }
    //把XML反序列化成对象
    public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) {
        return null;
    }


}
使用转换器
@Data
@Accessors(chain = true)
@Slf4j
@XStreamAlias("student-ww")
public class Student {
    @XStreamAlias("name-ww")
    private String name;

    @XStreamAlias("old-ww")
    private String old;


    public static void main(String[] args) {
        XStream xstream = new XStream();
        xstream.processAnnotations(Student.class);
        Student student = new Student().setOld("old").setName("name");
        xstream.registerConverter(new StudentConvert());
        log.info(xstream.toXML(student));
    }
}
因为被覆盖了,所以无效!
<student-ww>
  <姓名>name</姓名>
  <年龄>old</年龄>
  <转换器>自定义的转换器</转换器>
</student-ww>

Xstream对象流

输出流的意思,就是输出结果的意思,我们可以随意的输出各种结果:
http://x-stream.github.io/objectstream.html

package test;

import com.thoughtworks.xstream.XStream;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 * Created by wangji on 2017/3/20.
 */

@Slf4j
@Data
@Accessors(chain = true)
public class Person  {
    private String name;
    private String old;
    public static void main(String[] args) {
        try {
            XStream xStream = new XStream();
            Person person = new Person().setOld("old").setName("name");
            ObjectOutputStream out = xStream.createObjectOutputStream(System.out);
            out.writeObject(person);
            out.writeObject("Hello");
            out.writeInt(12345);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出结果:

<object-stream>
  <test.Person>
    <name>name</name>
    <old>old</old>
  </test.Person>
  <string>Hello</string>
  <int>12345</int>
</object-stream>

利用对象流增加XML声明

利用继承的特性,覆盖掉父类的toXML(Object obj, Writer writer),先输出一部分的xml的声明;

/**
 * Created by wangji on 2017/3/23.
 * 增加XML声明,默认XStream是没有XML声明的
 */
public class XmlUtf8Xstream extends XStream {
    /**
     * xml版本号,默认1.0
     */
    private String version;
    /**
     * xml编码,默认UTF-8
     */
    private String encoding;
    public XmlUtf8Xstream() {
        this("1.0","UTF-8");
    }
    //XML的声明
    public String getDeclaration() {
        return "< ?xml version=\"" + this.version + "\" encoding=\"" + this.encoding + "\"? >\n";
    }

    public XmlUtf8Xstream(String version, String encoding) {
        this.version = version;
        this.encoding = encoding;
    }

    /**
     * 覆盖父类的方法,然后调用父类的,输出的时候先输出这个XML的声明
     * @param obj
     * @param output
     */
    @Override
    public void toXML(Object obj, OutputStream output){
        try {
            String dec = this.getDeclaration();
            byte[] bytesOfDec = dec.getBytes("UTF-8");
            output.write(bytesOfDec);
        } catch (Exception e) {
            throw new RuntimeException("error", e);
        }
        super.toXML(obj, output);
    }

    @Override
    public void toXML(Object obj, Writer writer) {
        try {
            writer.write(getDeclaration());
        } catch (Exception e) {
            throw new RuntimeException("error", e);
        }
        super.toXML(obj, writer);
    }

}

例子:


@Slf4j
@Data
@Accessors(chain = true)
public class Person   implements PersonIn {
    private String name;
    private String old;

    public static void main(String[] args) {

        XStream xStream = new XmlUtf8Xstream();
        xStream.alias("package",Person.class);
        Person person = new Person().setOld("old").setName("name");
        log.info(xStream.toXML(person));
    }
}

输出结果:

< ?xml version="1.0" encoding="UTF-8"?>
<package>
  <name>name</name>
  <old>old</old>
</package>
  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值