XStream笔记「建议收藏」

XStream笔记「建议收藏」XStream是一套简洁易用的开源类库,用于将Java对象序列化为XML或者将XML反序列化为Java对象,是Java对象和XML之间一个双向转换器。1.XStream概述2.快速入门User.java: publicclassUserimplementsSerializable{ privatestaticfinallongserialVersionU…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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;
	}
}

Jetbrains全家桶1年46,售后保障稳定

 

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文件。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219256.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java运行时异常的特点是什么_java运行时异常与一般异常

    java运行时异常的特点是什么_java运行时异常与一般异常1,java.lang.NullPointerException这个异常的解释是”程序遇上了空指针”,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。2,java.lang.ClassNotFoundException异常的解释是”指定的类不存在”,这里主要考虑一下类的名称和路径是否正确即可…

    2022年9月1日
    4
  • web大前端必备的VSCode插件,常用的(15个)「建议收藏」

    web大前端必备的VSCode插件,常用的(15个)「建议收藏」VisualStudioCode是由微软开发的一款免费、跨平台的文本编辑器。由于其卓越的性能和丰富的功能,它很快就受到了大家的喜爱。就像大多数IDE一样,VSCode也有一个扩展和主题市场,包含了数以千计质量不同的插件。为了帮助大家挑选出值得下载的插件,我们针对性的收集了一些实用、有趣的插件与大家分享。1.Open-In-Browser由于VSCode没有提供直接在浏览…

    2022年7月25日
    42
  • 目标检测ssd算法实践教程_目标检测算法有哪些

    目标检测ssd算法实践教程_目标检测算法有哪些目录一、背景(基本介绍)二、网络结构三、具体过程1.defaultbox匹配2.损失函数3.数据增广4.AtrousAlgothrim5.NMS(非极大值抑制)五、性能评估优点:缺点:SSD算法的改进:DSSD1.DSSD网络结构图19VGG网络与ResNet网络的对比2.实现细节3.训练…

    2022年10月10日
    2
  • 笛卡尔心形函数图像_笛卡尔心形曲线

    笛卡尔心形函数图像_笛卡尔心形曲线js绘制canvas图形varcr=document.getElementById(“cardioid”);varW=cr.width/2,H=cr.height/3,R=150;varc=cr.getContext(“2d”);varG=360,g=0,T=Math.PI*2,t=T/G;c.save();c.translate(W,…

    2022年10月17日
    2
  • Tomcat 下载、安装、配置图文教程

    Tomcat 下载、安装、配置图文教程ApacheTomcat下载、安装、配置图文教程自我心得1、Tomcat下载(1)Tomcat官网:Tomcat官方网址,可以在此处下载Tomcat。(2)点击左侧Download下的对应版本。注意有zip和exe两种格式的,zip是免安装版的,exe是安装版。同时观察自己的电脑是64位系统还是32位系统。例如进入:Tomcat9版本下载页面,下滑,到core处选择自己需要的版本,如图所示:…

    2022年5月12日
    46
  • SQLServer中存储过程StoredProcedure创建及C#调用(转)

    SQLServer中存储过程StoredProcedure创建及C#调用(转)此文作为入门了解用,转自http://www.2cto.com/database/201502/378260.html存储过程就是已经编译好的、优化过的放在数据库服务器中的一些SQL语句;可供应用程序直接调用。使用存储过程有以下几个优点:1、执行速度比普通的SQL语句快2、便于集中控制3、可以降低网络的通信量4、保证数据库的安全性和完整性5、灵活性创建存储过程可…

    2022年7月26日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号