XStream使用记录
XStream使用记录
官网
http://x-stream.github.io/index.html
下载地址
http://x-stream.github.io/download.html
参考资料
- x-stream javaDOC: http://x-stream.github.io/javadoc/index.html
什么是 XStream?
官网:
XStream is a simple library to serialize objects to XML and back again.
XStream 是一个序列化Java对象为XML和XML 反序列化为 Java 对象的简单库。
XStream 架构由 6个主要组件组成:
- Converters
- Mappers
- Drivers (Writer and Reader)
- Context
- Type Permissions
- Facade
使用例子
1. 下载 xstream-1.4.18.jar 或 引入依赖
下载地址:https://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream/1.4.18/xstream-1.4.18.jar
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.18</version>
</dependency>
2. 编写 XStreamDemo 类
package org.black.demo.xstream;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;
import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
import com.thoughtworks.xstream.core.ClassLoaderReference;
import com.thoughtworks.xstream.io.HierarchicalStreamDriver;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.security.AnyTypePermission;
/**
* 提供序列化和反序列化能力
*
*/
public class XStreamDemo {
/**
* 对象序列化为XML
*/
public String serialize(Object obj) {
// 实例化 XStream 对象,需要 3个参数:
// ReflectionProvider
// HierarchicalStreamDriver
// ClassLoaderReference
// 反射提供者
ReflectionProvider reflectionProvider = new PureJavaReflectionProvider();
// 流解析器和编写器的实现(这里使用 dom )
HierarchicalStreamDriver driver = new DomDriver();
// 类加载器引用
ClassLoaderReference classLoaderReference = new ClassLoaderReference(obj.getClass().getClassLoader());
XStream xstream = new XStream(reflectionProvider, driver, classLoaderReference);
xstream.alias(obj.getClass().getName(), obj.getClass());
// 序列化为xml
return xstream.toXML(obj);
}
/**
* XML反序列化为对象
*/
public <T> T deserialize(String xml, T root) {
// 反射提供者
ReflectionProvider reflectionProvider = new PureJavaReflectionProvider();
// 流解析器和编写器的实现
HierarchicalStreamDriver driver = new DomDriver();
// 类加载器引用
ClassLoaderReference classLoaderReference = new ClassLoaderReference(root.getClass().getClassLoader());
XStream xstream = new XStream(reflectionProvider, driver, classLoaderReference);
xstream.alias(root.getClass().getName(), root.getClass());
// 开启任何访问权限
xstream.addPermission(AnyTypePermission.ANY);
// 反序列化为对象
return (T) xstream.fromXML(xml, root);
}
}
3. 编写 User 类
package org.black.demo.xstream;
import java.io.Serializable;
import java.util.Arrays;
/**
* 用户
*/
public class User implements Serializable
{
// serialVersionUID IDE自动生成的序列化ID
private static final long serialVersionUID = -3552351542858137630L;
// 姓名
private String name;
// 性别
private String sex;
// 年龄
private Integer age;
// 身高
private Double height;
// 分数
private Double[] points;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
public Double[] getPoints() {
return points;
}
public void setPoints(Double[] points) {
this.points = points;
}
@Override
public String toString() {
return "User [name=" + name + ", sex=" + sex + ", age=" + age + ", height=" + height + ", points=" + Arrays.toString(points) +"]";
}
}
4. 编写测试类
package org.black.demo.xstream;
/**
* 测试
*
* @author black
* @date 2021-12-10 14:31:024
*/
public class XStreamDemoTest {
public static void main(String[] args) {
User admin = new User();
admin.setName("管理员");
admin.setAge(27);
admin.setHeight(180.00);
admin.setSex("男");
Double[] points = new Double[0];
admin.setPoints(points);
System.out.println("admin 序列化前:" + admin);
XStreamDemo demo = new XStreamDemo();
String adminXMLInfo = demo.serialize(admin);
System.out.println("admin 序列化为 xml 后:" + adminXMLInfo);
User adminReplicate = new User();
demo.deserialize(adminXMLInfo, adminReplicate);
System.out.println("xml 反序列化后:" + adminReplicate);
}
}
5. 测试结果
admin 序列化前:User [name=管理员, sex=男, age=27, height=180.0, points=[]]
admin 序列化为 xml 后:<org.black.demo.xstream.User>
<name>管理员</name>
<sex>男</sex>
<age>27</age>
<height>180.0</height>
<points/>
</org.black.demo.xstream.User>
xml 反序列化后:User [name=管理员, sex=男, age=27, height=180.0, points=[]]
XStream使用记录的更多相关文章
- 打造完美的xml技术解决方案(dom4j/xstream)
转: XML 技术是随着 Java 的发展而发展起来的.在 XML 出现之前对于简单的数据格式通常是存储在 ini 配置文件等文本文件中,复杂的格式则采用自定义的文件格式,因此对于每种文件格式都要有专 ...
- 使用XStream注解实现Java对象与XML互相转换的代码示例
本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例. 我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件.如:jdom.dom4j等 ...
- xml 解析 Xstream
1.概述 json 解析可以使用gson包解为现成的对象,那么xml可以不可以用现成的包解析成java的对象呢? 带着这个问题,查询了一些材料找到了Xstream解析方法,确实可以完成这种思考,只是实 ...
- 使用XStream是实现XML与Java对象的转换(6)--持久化
九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...
- Tomcat通过Memcached实现session共享的完整部署记录
对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...
- jmeter 4.0版本更新说明(个人做个记录)总版本更新合集
版本4.0 摘要 新的和值得注意的 不兼容的变化 Bug修复 改进 非功能性变化 已知问题和解决方法 谢谢 新的和值得注意的 核心改进 JMeter现在支持JAVA 9. 提供新的边界提取器元件,提供 ...
- XStream 1.4.10版本处理xml使用问题
XStream pom依赖: <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifa ...
- 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL
在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...
- nginx配置反向代理或跳转出现400问题处理记录
午休完上班后,同事说测试站点访问接口出现400 Bad Request Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...
随机推荐
- 使用scrapy 创建爬虫项目
使用scrapy 创建爬虫项目 步骤一: scrapy startproject tutorial 步骤二: you can start your first spider with: cd tuto ...
- unity 加载网络图片
摘要:利用Http加载网络图片. 解决思路: 1.直接用unity 自带的www加载,在高版本www已经过时了. 2.本文直接使用万能的文件流加载. (1)使用System.Net.HttpWebRe ...
- 前端经典面试题vue面试题
1.什么是MVVM? MVVM是一种设计思想. Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑: View 代表UI 组件,它负责将数据模型转化成UI 展现出来,View ...
- 三大主流软件负载均衡器对比(LVS & Nginx & Haproxy)
LVS:1.抗负载能力强.抗负载能力强.性能高,能达到F5硬件的60%:对内存和cpu资源消耗比较低2.工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流 ...
- Poco实体
在Poco实体中,一般只有属性没有方法,这在软件设计中称为贫血模型, 在DDD领域驱动设计中,提倡充血模型,即你的Poco实体中,即有属性,也有操作属性的方法,[PS:注意这里说的是操作属性的方法,你 ...
- 为MySQL加锁?
在日常操作中,UPDATE.INSERT.DELETE InnoDB会自动给涉及的数据集加排他锁,一般的 SELECT 一般是不加任何锁的.我们可以使用以下方式显示的为 SELECT 加锁. 共享锁: ...
- JSP有哪些动作?分别是什么?
外JSP共有以下7种基本动作 jsp:include:在页面被请求的时候引入一个文件. jsp:useBean:寻找或者实例化一个JavaBean. jsp:setProperty:设置JavaBea ...
- 通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
Dao接口即Mapper接口.接口的全限名,就是映射文件中的namespace的值:接口的方法名,就是映射文件中Mapper的Statement的id值:接口方法内的参数,就是传递给sql的参数. M ...
- MyBatis与Hibernate有哪些不同?
(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句. (2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活 ...
- jQuery--表单的过滤
1.表单过滤器的介绍 :input 所有表单元素(<input>/<select>/<textarea>/<button>) :text 文本框< ...