不安分的黑娃
踏踏实实,坚持学习,慢慢就懂了~

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=[]]

posted on 2021-12-10 15:41  不安分的黑娃  阅读(434)  评论(0编辑  收藏  举报