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>
相关文章推荐
- xStream 的简单使用 xml to bean
- android中解析复杂xml(XStream简单使用)
- XStream简单使用
- Xstream的简单使用
- java中解析复杂xml(XStream简单使用)
- XStream的使用方法、简单使用方法、xml的解析方法
- XStream简单使用01——xml和Ojbect互转
- 简单使用XStream
- xstream的简单使用
- xStream 的简单使用 xml to bean
- XStream的简单使用
- XStream的简单使用
- 封装JDBC,简单快捷的使用PreparedStatement对象
- c#中类的简单使用学习
- 通过一个简单的SWING日历BEAN开发学习Calendar类的使用(2)JCalendar源代码
- SpringFramework中的AOP简单使用
- 对MSNP9协议的简单使用示例
- Win32汇编教程三 一个简单的对话框 --- 兼谈资源文件的使用
- 在自己的MIS系统使用简单的加密功能加密基本数据
- python中使用状态机的简单例子---截取'/x00'之前的字符串