`
longying2008
  • 浏览: 302042 次
社区版块
存档分类
最新评论

XStream笔记

阅读更多

XStream是一套简洁易用的开源类库,用于将Java对象序列化为XML或者将XML反序列化为Java对象,是Java对象和XML之间一个双向转换器。

1.XStream概述

2.快速入门

User.java:

 

public class User implements Serializable {
	private static final long serialVersionUID = 1L;
	private int userId;
	private String name;
	public User() {}
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

public class XStreamSample_01 {
	private static XStream xstream;
	static {
		//创建一个XStream实例并指定一个XML解析器
		xstream = new XStream(new DomDriver());
	}
	//初始化转换对象
	public static User getUser() {
		User user = new User();
		user.setUserId(1);
		user.setName("XStreamSample");
		return user;
	}
	//Java对象转化为XML
	public static void objectToXML() throws Exception {
		//1.获得要转化的Java对象实例
		User user = XStreamSample_01.getUser();
		//2.实例化一个文件输出流
		FileOutputStream outputStream = new FileOutputStream("D:\\temporary\\XStream\\user.xml");
		//3.将User对象转换为XML,并保存到指定文件
		xstream.toXML(user, outputStream);
	}
	//XML转化为Java对象
	public static void XMLToObject() throws Exception {
		//实例化一个文件输入流
		FileInputStream inputStream = new FileInputStream("D:\\temporary\\XStream\\user.xml");
		//将XML文件输入流
		User user = (User)xstream.fromXML(inputStream);
		System.out.println("user's id: " + user.getUserId());
		System.out.println("user's name: " + user.getName());
	}
}

3.使用XStream别名:

XStream别名配置包含三种情况:

①.类别名,用alias(String name, Class type)

②.类成员别名,用aliasField(String alias, Class definedIn, String fieldName)

③.类成员作为属性别名,用aliasAttribute(String alias, String attributeName, String alias)单独命名没有意义,还要通过useAttributeFor(Class definedIn, String fieldName)应用到某个类上。

在XStreamSample_01中添加如下代码:

 

static {
		//设置类别名,默认为当前类名加上包名
		xstream.alias("user", User.class);
		//设置类成员名
		xstream.aliasField("id", User.class, "userId");
		xstream.aliasField("userName", User.class, "name");
	}


XStream转换器:转换一些自定义类型

DateConverter.java

 

public class DateConverter implements Converter {
	private Locale locale;
	public DateConverter() {
		this.locale = Locale.SIMPLIFIED_CHINESE;
	}
	public DateConverter(Locale locale) {
		super();
		this.locale = locale;
		System.out.println("--有参数的构造方法--");
	}
	//判断要转换的类型
	@Override
	public boolean canConvert(Class arg0) {
		return Date.class.isAssignableFrom(arg0);
	}
	//Java对象到XML转换逻辑
	@Override
	public void marshal(Object arg0, HierarchicalStreamWriter arg1,
			MarshallingContext arg2) {
		//getDateInstance(..):获取给定语言环境的给定格式化风格的日期格式器
		DateFormat formatter = DateFormat.getDateInstance(DateFormat.DATE_FIELD, this.locale);
		arg1.setValue(formatter.format(arg0));
	}
	//XML到Java对象转换
	@Override
	public Object unmarshal(HierarchicalStreamReader arg0,
			UnmarshallingContext arg1) {
		GregorianCalendar calendar = new GregorianCalendar();
		DateFormat formatter = DateFormat.getDateInstance(DateFormat.DATE_FIELD, this.locale);
		try {
			calendar.setTime(formatter.parse(arg0.getValue()));
		} catch (ParseException e) {
			System.out.println(e.getMessage());
		}
		return calendar.getGregorianChange();//获得格里高利历的更改日期
	}

}


调用:

 

static {
		//创建一个XStream实例并指定一个XML解析器
		xstream = new XStream(new DomDriver());
		xstream.processAnnotations(LoginLog.class);
		//注册自定义的日期转换器
		xstream.registerConverter(new DateConverter(Locale.SIMPLIFIED_CHINESE));
	}


问题:书上没有无参构造方法,但是我不定义无参构造方法会报错。并且如果我不在无参构造方法中初始化locale,在DateFormat formatter = DateFormat.getDateInstance(DateFormat.DATE_FIELD, this.locale);这名会报locale空指针。不知道什么原因。

XStream注解:

示例:

 

//别名注解,作用于类和字段
@XStreamAlias("loginLog")
public class LoginLog implements Serializable {
	//忽略字段,作用于字段
	@XStreamOmitField
	private static final long serialVersionUID = 1L;
	//转换为属性,作用于字段
	@XStreamAsAttribute
	@XStreamAlias("id")
	private int loginLogId;
	@XStreamAlias("userId")
	private int userId;
	@XStreamAlias("lastIp")
	private String ip;
	@XStreamConverter(DateConverter.class)
	private Date loginDate;
	public LoginLog() {}
	public int getLoginLogId() {
		return loginLogId;
	}
	public void setLoginLogId(int loginLogId) {
		this.loginLogId = loginLogId;
	}
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public Date getLoginDate() {
		return loginDate;
	}
	public void setLoginDate(Date loginDate) {
		this.loginDate = loginDate;
	}
	@Override
	public String toString() {
		return "用户 " +  userId + " 最后一次登陆时间为:" + loginDate;
	}
}


启用XStream提供的注解功能,需要在执行Java对象与XML转换之前,先注册标注了XStream注解的Java对象。

 

xstream.processAnnotations(LoginLog.class);
		//自动加载注解Bean
		//xstream.autodetectAnnotations(true);

流化对象:

 

public class ObjectStreamSample {
	private static XStream xstream = new XStream();
	//Java对象转化为XML
	public static LoginLog getLoginLog() {
		LoginLog loginLog = new LoginLog();
		loginLog.setLoginLogId(1);
		loginLog.setUserId(1);
		loginLog.setIp("192.168.1.1");
		loginLog.setLoginDate(new Date());
		return loginLog;
	}
	public void objectToXML() throws Exception {
		LoginLog loginLog = ObjectStreamSample.getLoginLog();
		//创建一个PrintWriter,用于输出
		PrintWriter writer = new PrintWriter("D:\\temporary\\XStream\\loginLog_02.xml");
		//选用一个HierarchicalStreamWriter的实现类来创建输出
		PrettyPrintWriter ppw = new PrettyPrintWriter(writer);
		//CompactWriter cw = new CompactWriter(writer);
		//创建对象输出流
		ObjectOutputStream out = xstream.createObjectOutputStream(ppw);
		out.writeObject(loginLog);
		out.close();
	}
	//XML转化为Java对象
	public LoginLog xmlToObject() throws Exception {
		//通过对象流进行输入操作
		FileReader reader = new FileReader("D:\\temporary\\XStream\\loginLog_02.xml");
		BufferedReader bufferedReader = new BufferedReader(reader);
		//创建对象输入流
		ObjectInputStream input = xstream.createObjectInputStream(bufferedReader);
		//从XML文件中读取对象
		LoginLog loginLog = (LoginLog)input.readObject();
		return loginLog;
	}
}


PrettyPrintWriter和CompactWriter的区别在于,用CompactWriter方法输出的为连续的没有分隔的XML文件,而用PrettyPrintWriter方法输出的为有分隔有一定格式的XML文件。

 

分享到:
评论

相关推荐

    XStream笔计rar.rar

    《XStream笔记——深入解析与应用》 XStream是一款强大的Java库,用于将对象序列化为XML,反之亦然。它的主要优点在于简洁的API和易于理解的转换过程,使得XML与Java对象之间的绑定变得非常直观。在本篇笔记中,...

    最齐全的xstream1.4.8.jar

    最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar ...

    xstream-1.4.15.jar

    XStream 反序列化漏洞(CVE-2020-26258 & 26259),修复jar包 xstream-1.4.15.jar Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象。XStream 是一款开源软件,允许在 BSD 许可证的许可下分发...

    xstream-1.4.2.jar

    《XStream详解与应用》 XStream是一款强大的Java库,用于将对象序列化为XML,同时也能从XML数据中反序列化回对象。在标题"xstream-1.4.2.jar"中,我们看到的是XStream的一个特定版本——1.4.2。这个版本包含了...

    xstream最新版 - xstream-1.4.18.jar

    xstream最新版jar包

    com.thoughtworks.xstream.XStream操作XML和java对象的一些用法

    XStream库提供了一个简单、直观的方式来实现这种转换,使得XML序列化和反序列化变得非常方便。本篇将详细介绍XStream如何处理XML与Java对象的相互转换,以及如何处理List、Map等集合类型的数据。 首先,XStream是一...

    xstream1.4.15.JAR

    XStream 是一个流行的 Java 库,用于将对象序列化为 XML 和从 XML 反序列化回对象。这个库广泛应用于各种 Java 应用程序,尤其是那些需要在网络间传输或存储对象数据的情况。在标题提到的 "xstream1.4.15.JAR" 文件...

    xStream完整Jar包

    **XStream 概述** XStream 是一个 Java 库,用于将对象序列化为 XML,以及从 XML 反序列化回对象。它提供了一种简单而直观的方式来处理 XML 数据,使得 XML 文档与 Java 对象之间的转换变得轻而易举。这个“xStream...

    xstream相关的jar包

    XStream是一款强大的Java库,用于将Java对象序列化为XML,反之亦然。这个库的主要优点在于其简单易用的API和对复杂对象图的处理能力。在标题中提到的"Xstream相关的jar包",是指为了使用XStream库,需要引入的依赖...

    xstream-1.4.5.jar

    xstream xstream-1.4.5.jar

    Java用xStream拼接xml

    当需要将数据转换为XML格式以便于传输或处理时,工具如xStream就显得尤为重要。Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream...

    xstream-1.3.1.zip

    《XStream 1.3.1:Java对象到XML的高效转换工具》 XStream是一款强大的Java库,它能够将Java对象序列化为XML,并能从XML反序列化回Java对象。这个“xstream-1.3.1.zip”文件包含了一个名为“xstream-1.3.1.jar”的...

    xstream-1.4.8最齐全的jar包

    XStream是一款强大的Java库,主要用于将Java对象序列化为XML,以及将XML反序列化回Java对象。在Java开发中,这种能力对于数据持久化、网络传输或配置存储等场景非常有用。标题中的"xstream-1.4.8最齐全的jar包"表明...

    xstream解析依赖包

    《XStream解析依赖包详解》 在Java开发中,数据序列化是一个不可或缺的环节,它使得对象的状态可以被保存和恢复。XStream是一款强大的Java库,用于将Java对象转换为XML,反之亦然,极大地简化了序列化和反序列化的...

    xstream-1.4.19.jar

    xstream-1.4.19.jar

    xstream-1.4.11-API文档-中文版.zip

    赠送jar包:xstream-1.4.11.jar; 赠送原API文档:xstream-1.4.11-javadoc.jar; 赠送源代码:xstream-1.4.11-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.11.pom; 包含翻译后的API文档:xstream-1.4.11-...

    xstream学习文档及实例

    XStream 是一个强大的 Java 库,它允许程序员将 Java 对象序列化为 XML,反之亦然。这个库因其简单易用、灵活性高以及性能优异而备受赞誉。在本学习文档中,我们将深入探讨 XStream 的核心概念、用法以及如何在实际...

    xstream-1.4.20.jar

    xstream-1.4.20.jar

    XStream 1.4.11 jar包

    **XStream 1.4.11 jar包详解** XStream 是一个强大的 Java 库,它提供了一种简单且高效的方式来序列化和反序列化 Java 对象为 XML,反之亦然。这个工具库的设计目标是使得 XML 和 Java 对象之间的转换变得极其简单...

    Oracle Database XStream Guide 11g Release 2 (11.2)-302

    Oracle Database XStream Guide 11g Release 2 (11.2)-302 Oracle Database XStream 是 Oracle 公司推出的一个数据捕获和事件处理工具,旨在帮助用户实时捕获和处理数据库中的数据变化。下面是 Oracle Database ...

Global site tag (gtag.js) - Google Analytics