XStream

官网地址:XStream

Maven

<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
	<groupId>com.thoughtworks.xstream</groupId>
	<artifactId>xstream</artifactId>
	<version>1.4.10</version>
</dependency>

初始化XStream

XStream xstream = new XStream();

指定别名

// 类
xstream.alias("student", Student.class);
// 字段
xstream.aliasField("name", Student.class, "studentName");
// 隐式集合
xstream.addImplicitCollection(Student.class, "notes");
// 属性
xstream.useAttributeFor(Student.class, "studentName");
xstream.aliasField("name", Student.class, "studentName");
// 包
xstream.aliasPackage("my.company.xstream", "com.yiibai.xstream");

注解

使用注解前,需要先设置XStream

xstream.processAnnotations(Note.class);
    或
xstream.autodetectAnnotations(true);
// 类、字段
@XStreamAlias("student")
// 隐式集合
@XStreamImplicit
// 属性
@XStreamAlias("name")
@XStreamAsAttribute

对象流

ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(new FileOutputStream("test.txt"));
objectOutputStream.writeObject(student1);
objectOutputStream.writeObject(student2);
objectOutputStream.writeObject(student3);
objectOutputStream.writeObject(student4);
objectOutputStream.writeObject("Hello World");
objectOutputStream.close();

ObjectInputStream objectInputStream = xstream.createObjectInputStream(new FileInputStream("test.txt"));
Student student5 = (Student) objectInputStream.readObject();
Student student6 = (Student) objectInputStream.readObject();
Student student7 = (Student) objectInputStream.readObject();
Student student8 = (Student) objectInputStream.readObject();
String text = (String) objectInputStream.readObject();
System.out.println(student5);
System.out.println(student6);
System.out.println(student7);
System.out.println(student8);
System.out.println(text);

自定义转换器

使用前需要设置XStream:

xstream.registerConverter(new StudentConverter());

示例:

class StudentConverter implements Converter {

	public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
		Student student = (Student) value;
		writer.startNode("name");
		writer.setValue(student.getName().getFirstName() + "," + student.getName().getLastName());
		writer.endNode();
	}

	public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
		reader.moveDown();
		String[] nameparts = reader.getValue().split(",");
		Student student = new Student(nameparts[0], nameparts[1]);
		reader.moveUp();
		return student;
	}

	public boolean canConvert(Class object) {
		return object.equals(Student.class);
	}
}

canConvert - 检查支持的对象类型的序列化。
marshal - 序列化对象到XML。
unmarshal - 从XML对象反序列化

解决控制台报错Security framework of XStream not initialized, XStream is probably vulnerable.

XStream.setupDefaultSecurity(xstream);

解决com.thoughtworks.xstream.security.ForbiddenClassException异常

Class<?>[] classes = new Class[] { Student.class, Note.class };
xstream.allowTypes(classes);

参考资料

posted @   流星<。)#)))≦  阅读(2525)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示