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

  • 背景介绍
  • XStream的简介
  • 注解简介
  • 应用实例

背景介绍

我们在工作中经常 遇到文件解析为数据或者数据转化为xml文件的情况,之前我一直采用的方式都是手动的来解析或拼接XML文件,这个做法固然是可以的,但是代码部分会显得非常臃肿,所以就查找了相关的资料,发现了一个名为XStream的类库可以做这件事,下面我们来看一下.

XStream的简介

官网地址:http://x-stream.github.io/

从官网介绍我们能看到以下几个特性:

  • 易用
  • 不需要Mapping文件

    不需要额外提供Mapping文件即可完成映射

  • 高性能

    高速且低内存消耗

  • 整洁的XML文件

    生成的XML的相当简洁

  • 不需要修改对象

    可以序列化private修饰的属性,且不需要提供get/set方法

  • 完整的对象结构支持

    支持循环引用情况下的输出

  • 兼容其他的XML API

    可以对任何的树形结构进行序列化或反序列化

  • 可以自定义的转换策略

    可以通过策略的注册,允许自定义特定类型的转化为XML的样式

  • 安全的框架

    对未分组的类型进行精细化的控制,防止输入错误而导致的安全问题

  • 良好的异常反馈

    当XML文件格式错误的时候,能够提供诊断信息帮助处理

  • 多样的输出格式

    不止是XML他还支持JSON及其变种

注解简介

从XStream的官网我们了解到,XStream不需要Mapping文件就能完成JavaBean和XML之间的转变,但大部分时候我们需要对生成的XML文件进行定制,name我们需要了解XStream提供的注解

注解 作用 适用范围
@XStreamAlias 设置别名 类或属性
@XStreamImplicit 忽略属性 集合类型的属性
@XStreamAsAttribute 将JavaBean转换成节点属性 属性
@XStreamOmitField 忽略属性 属性
@XStreamConverter 注入转换器

应用实例

首先在我们的项目中加入依赖:

<dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.11.1</version>
</dependency>

假定环境为Computer和CPU两个类:

public class Computer implements Serializable {private static final long serialVersionUID = 567119860357020081L;private String name;private String brand;private List<CPU> processors;public Computer() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public List<CPU> getProcessors() {return processors;}public void setProcessors(List<CPU> processors) {this.processors = processors;}
}
public class CPU implements Serializable {private static final long serialVersionUID = -718438777162957779L;private String name;private String generation;public CPU() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGeneration() {return generation;}public void setGeneration(String generation) {this.generation = generation;}
}

写一个测试方法:

import com.hykj.facheck.entity.CPU;
import com.hykj.facheck.entity.Computer;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;import java.util.ArrayList;
import java.util.List;public class XStreamTest {public static void main(String[] args) {List<CPU> cpuList = new ArrayList<>();CPU cpu1 = new CPU();cpu1.setGeneration("8-i5-K");cpu1.setName("第一个");cpuList.add(cpu1);CPU cpu2 = new CPU();cpu2.setGeneration("8-i5-U");cpu2.setName("第二个");cpuList.add(cpu2);Computer computer = new Computer();computer.setBrand("huawei");computer.setName("wej-laptop");computer.setProcessors(cpuList);XStream xstream = new XStream(new DomDriver());xstream.ignoreUnknownElements();xstream.processAnnotations(Computer.class);//javabean to xmlString xml = xstream.toXML(computer);System.out.println(xml);//xml to javabeanComputer computerFromXml = (Computer) xstream.fromXML(xml);System.out.println(computer.getName());}
}

运行程序,控制台打结果如下:

Connected to the target VM, address: '127.0.0.1:53977', transport: 'socket'
<com.hykj.facheck.entity.Computer><name>wej-laptop</name><brand>huawei</brand><processors><com.hykj.facheck.entity.CPU><name>第一个</name><generation>8-i5-K</generation></com.hykj.facheck.entity.CPU><com.hykj.facheck.entity.CPU><name>第二个</name><generation>8-i5-U</generation></com.hykj.facheck.entity.CPU></processors>
</com.hykj.facheck.entity.Computer>
Security framework of XStream not initialized, XStream is probably vulnerable.
wej-laptop
Disconnected from the target VM, address: '127.0.0.1:53977', transport: 'socket'Process finished with exit code 0

也就是说这样就可以用了,很棒棒
但是这个XML和我们的需求不太一样,我们加上注解,代码变成了这样:

import com.thoughtworks.xstream.annotations.XStreamAlias;import java.io.Serializable;
import java.util.List;@XStreamAlias("my")
public class Computer implements Serializable {private static final long serialVersionUID = 567119860357020081L;private String name;private String brand;@XStreamAlias("cpuList")private List<CPU> processors;public Computer() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public List<CPU> getProcessors() {return processors;}public void setProcessors(List<CPU> processors) {this.processors = processors;}
}
import com.thoughtworks.xstream.annotations.XStreamAlias;import java.io.Serializable;@XStreamAlias("oneCpu")
public class CPU implements Serializable {private static final long serialVersionUID = -718438777162957779L;private String name;private String generation;public CPU() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGeneration() {return generation;}public void setGeneration(String generation) {this.generation = generation;}
}

测试方法不变,结果如下:

Connected to the target VM, address: '127.0.0.1:54181', transport: 'socket'
<my><name>wej-laptop</name><brand>huawei</brand><cpuList><oneCpu><name>第一个</name><generation>8-i5-K</generation></oneCpu><oneCpu><name>第二个</name><generation>8-i5-U</generation></oneCpu></cpuList>
</my>
Security framework of XStream not initialized, XStream is probably vulnerable.
wej-laptop
Disconnected from the target VM, address: '127.0.0.1:54181', transport: 'socket'Process finished with exit code 0


这个XML就很舒服啦.
我们载试一下循环引用的情况吧,代码如下:

import com.thoughtworks.xstream.annotations.XStreamAlias;import java.io.Serializable;
import java.util.List;@XStreamAlias("my")
public class Computer implements Serializable {private static final long serialVersionUID = 567119860357020081L;private String name;private String brand;@XStreamAlias("cpuList")private List<CPU> processors;public Computer() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public List<CPU> getProcessors() {return processors;}public void setProcessors(List<CPU> processors) {this.processors = processors;}
}
import com.thoughtworks.xstream.annotations.XStreamAlias;import java.io.Serializable;@XStreamAlias("oneCpu")
public class CPU implements Serializable {private static final long serialVersionUID = -718438777162957779L;private String name;private String generation;private Computer computer;public CPU() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGeneration() {return generation;}public void setGeneration(String generation) {this.generation = generation;}public Computer getComputer() {return computer;}public void setComputer(Computer computer) {this.computer = computer;}
}
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;import java.util.ArrayList;
import java.util.List;public class XStreamTest {public static void main(String[] args) {Computer computer = new Computer();computer.setBrand("huawei");computer.setName("wej-laptop");List<CPU> cpuList = new ArrayList<>();CPU cpu1 = new CPU();cpu1.setGeneration("8-i5-K");cpu1.setName("第一个");cpu1.setComputer(computer);cpuList.add(cpu1);CPU cpu2 = new CPU();cpu2.setGeneration("8-i5-U");cpu2.setName("第二个");cpuList.add(cpu2);cpu1.setComputer(computer);computer.setProcessors(cpuList);XStream xstream = new XStream(new DomDriver());xstream.ignoreUnknownElements();xstream.processAnnotations(Computer.class);//javabean to xmlString xml = xstream.toXML(computer);System.out.println(xml);//xml to javabeanComputer computerFromXml = (Computer) xstream.fromXML(xml);System.out.println(computer.getName());}
}

运行一下,先查看是否构成循环引用:

确认有循环引用,继续运行代码,控制台打印如下:

Connected to the target VM, address: '127.0.0.1:54221', transport: 'socket'
<my><name>wej-laptop</name><brand>huawei</brand><cpuList><oneCpu><name>第一个</name><generation>8-i5-K</generation><computer reference="../../.."/></oneCpu><oneCpu><name>第二个</name><generation>8-i5-U</generation></oneCpu></cpuList>
</my>
Security framework of XStream not initialized, XStream is probably vulnerable.
wej-laptop
Disconnected from the target VM, address: '127.0.0.1:54221', transport: 'socket'Process finished with exit code 0

可以看到生成的XML中采用类似路径的reference属性来标识了位置,实际上我们一般是需要忽略这个属性的,采用@XStreamOmitField注解就好了.

转载于:https://www.cnblogs.com/zichuanhong/p/10355066.html

JAVA Bean和XML之间的相互转换 - XStream简单入门相关推荐

  1. java bean与xml转换_Java Bean与xml互相转换的方法分析

    本文实例讲述了Java Bean与xml互相转换的方法.分享给大家供大家参考,具体如下: XML和Java Bean互相转换是一个很有用的功能,因为两者有着前后合作的关系,但解析的过程比较痛苦.下面介 ...

  2. JAXB实现java对象与xml之间转换

    一.Jaxb处理java对象和xml之间转换常用的annotation有: 1. @XmlType 2. @XmlElement 3. @XmlRootElement 4. @XmlAttribute ...

  3. java关于对象(javabean)与xml之间的相互转换

    今天我们要探讨的一个问题是,如何将xml格式的字符串转换成对象,以及对象转换成xml字符串. 简介 现如今,虽然数据的传输大部分都是用json格式来进行传输,但是xml毕竟也会有一些老的项目在进行使用 ...

  4. java中logger_Java日志系统---Logger之简单入门

    Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...

  5. java实现8、10、16、2进制之间的相互转换(简单易懂实用快速)

    文章目录 1.二进制与其他进制的转换 2.十六进制与其他进制的转换 3.十进制与其他进制的转换 4.八进制与其他进制的转换 今天在练习算法题的时候遇到了进制之间的转化,如果通过深究原理的方式来写代码的 ...

  6. Java实现Excel和Office Open XML之间的相互转换

    前言 Office Open XML(也被称为OOXML)是一种压缩的.基于XML的Excel.Word和演示文档格式.有时,你可能需要将Excel文件转换为Office Open XML,以使其在各 ...

  7. java在线打开xml文件_java实现简单解析XML文件功能示例

    本文实例讲述了java实现简单解析XML文件功能.分享给大家供大家参考,具体如下: package demo; import java.io.File; import java.io.IOExcept ...

  8. java 转byte字符串,Java 字符串与byte之间的相互转换

    写在前面 上次在简书上第一次发表文章多了30位朋友关注和收到80多个喜欢让我受宠若惊.我当时打算以后要多写一些有价值的文章,才对得起关注我的朋友.然而,爱游戏的我在刚不久前把四公主接回来了~这一个多月 ...

  9. Java对象和XML之间的编排与反编排

    1 创建Java class 1.1 创建Classroom.jave(int id;int grade;String name) 1.2 创建Student.java(int id;String n ...

最新文章

  1. 语音合成系统之pyWORLD,WORLD使用简介
  2. 腾讯开放或将触发行业新一轮创业热潮
  3. python3环境下“No module named nrrd”的解决办法
  4. 【Groovy】闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )
  5. 拦截器,过滤器,监听器原理
  6. 三元表达式、列表推导式、生成器表达式、递归、内置函数、匿名函数
  7. NSURLSession学习笔记(二)Session Task
  8. mysql url 解析json数据_如何在MySQL中编写可以解析列中JSON数据的查...
  9. bat操作ftp上传下载命令
  10. 六安职院美和易思互联网+特色专业举行第一届HTML网页设计大赛
  11. 什么是服务端与客户端详解
  12. Going to Redmond (keep moving)
  13. [昇腾CANN自定义算子]TIK数据搬运data_move
  14. 词云库学习--python习题
  15. vb之msgbox用法(转)
  16. 后端总结(分布式架构设计)
  17. Flink1.14提交任务报错classloader.check-leaked-classloader问题解决
  18. PHP PDO 连接SQLSErver,php pdo连接sqlserver配置
  19. ./configure make make install 编译安装和卸载 (Linux)
  20. 安消一体化新动态(大华、海康威视、华为)

热门文章

  1. 区块链面试过程中的40个问题
  2. 10、软件质量工程师指南 - 软件项目角色指南系列文章
  3. String和StringBuffer的区别,String长度是固定的?
  4. 使用DocFX生成文档
  5. 常见的一些功能测试用例
  6. 10行代码理解Java锁消除
  7. HashMap的工作原理
  8. 【Python】青少年蓝桥杯_每日一题_10.11_小球反弹
  9. hive通过外表把数据存到mysql中_hive数据去重
  10. ups的空开、电缆及电池的配置计算