您的位置:首页 > 其它

XStream的简单使用

2017-03-23 20:41 204 查看

XStream的简单使用

参考

http://x-stream.github.io/tutorial.html xstream官方教程

http://www.cnblogs.com/LiZhiW/p/4313493.html#_label3 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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: