XStream使用记录

官网

http://x-stream.github.io/index.html

下载地址

http://x-stream.github.io/download.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使用记录的更多相关文章

  1. 打造完美的xml技术解决方案(dom4j/xstream)

    转: XML 技术是随着 Java 的发展而发展起来的.在 XML 出现之前对于简单的数据格式通常是存储在 ini 配置文件等文本文件中,复杂的格式则采用自定义的文件格式,因此对于每种文件格式都要有专 ...

  2. 使用XStream注解实现Java对象与XML互相转换的代码示例

    本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例.    我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件.如:jdom.dom4j等 ...

  3. xml 解析 Xstream

    1.概述 json 解析可以使用gson包解为现成的对象,那么xml可以不可以用现成的包解析成java的对象呢? 带着这个问题,查询了一些材料找到了Xstream解析方法,确实可以完成这种思考,只是实 ...

  4. 使用XStream是实现XML与Java对象的转换(6)--持久化

    九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...

  5. Tomcat通过Memcached实现session共享的完整部署记录

    对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...

  6. jmeter 4.0版本更新说明(个人做个记录)总版本更新合集

    版本4.0 摘要 新的和值得注意的 不兼容的变化 Bug修复 改进 非功能性变化 已知问题和解决方法 谢谢 新的和值得注意的 核心改进 JMeter现在支持JAVA 9. 提供新的边界提取器元件,提供 ...

  7. XStream 1.4.10版本处理xml使用问题

    XStream pom依赖: <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifa ...

  8. 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL

    在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...

  9. nginx配置反向代理或跳转出现400问题处理记录

    午休完上班后,同事说测试站点访问接口出现400 Bad Request  Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...

随机推荐

  1. CF1117G题解

    题意:区间建笛卡尔树,求每个节点的siz之和. 首先看到笛卡尔树,就应该想到,因为这是一个排列,可以找到通过左边和右边第一个比自己大的元素来"建立"笛卡尔树. 设 \(l(u)\) ...

  2. WPF 布局之综合实例

    WPF 布局之综合实例 <Window x:Class="UniFormGridDemo.MainWindow" xmlns="http://schemas.mic ...

  3. loj3161「NOI2019」I 君的探险(随机化,整体二分)

    loj3161「NOI2019」I 君的探险(随机化,整体二分) loj Luogu 题解时间 对于 $ N \le 500 $ 的点,毫无疑问可以直接 $ O(n^2) $ 暴力询问解决. 考虑看起 ...

  4. Java8 HashMap扩容时为什么不需要重新hash

    技巧: 与&操作   和   与 n 如8 与,为0  则位置不变 https://blog.csdn.net/zlp1992/article/details/104376309 java8在 ...

  5. BFC优化?

    块格式化上下文, 特性: 使 BFC 内部浮动元素不会到处乱跑: 和浮动元素产生边界.

  6. requests库获取图片响应流进行转发

    遇到了一个问题,使用requests进行转发 requests响应流的时候,出现各种问题,问题的描述没有记录,不过Debug以下终于解决了问题.......下面简单的描述解决方案 response = ...

  7. 有哪些类型的通知(Advice)?

    Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用 @Before 注解标记进行配置. After Returning - 这些类型的 Advice 在连接点方法 ...

  8. spring bean 容器的生命周期是什么样的?

    spring bean 容器的生命周期流程如下: 1.Spring 容器根据配置中的 bean 定义中实例化 bean. 2.Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置. 3 ...

  9. Python - numpy.clip()函数

    np.clip( a, a_min, a_max, out=None): 部分参数解释: 该函数的作用是将数组a中的所有数限定到范围a_min和a_max中.a:输入矩阵:a_min:被限定的最小值, ...

  10. IOS动态调试汇总-傻瓜版教程

    参考博客: https://juejin.cn/post/6872764160640450574#heading-4 (断点后续指令) https://www.jianshu.com/p/67f08a ...