XStream使用注解的方式格式化生成的xml

实体类:

package cn.framework.t2;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamImplicit;

@XStreamAlias("user")
public class User {
	@XStreamAsAttribute
	@XStreamAlias("id")
	private int userId;
	
	@XStreamAlias("userName")
	private String userName;
	
	@XStreamAlias("pwd")
	private String pwd;
	
//	@XStreamImplicit
	private List<UserLog> logs=new ArrayList<UserLog>();
	
	@XStreamConverter(DateConverter1.class)
	private Date lastVisted;
	
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public List getLogs() {
		return logs;
	}
	public void setLogs(List logs) {
		this.logs = logs;
	}
	public Date getLastVisted() {
		return lastVisted;
	}
	public void setLastVisted(Date lastVisted) {
		this.lastVisted = lastVisted;
	}
	@Override
	public String toString() {
		return "User [userId=" + userId + ", userName=" + userName + ", pwd="
				+ pwd + ", logs=" + logs + ", lastVisted=" + lastVisted + "]";
	}
	
	
}

package cn.framework.t2;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;

@XStreamAlias("log")
public class UserLog {
	@XStreamAsAttribute
	@XStreamAlias("id")
	private int logId;
	
	@XStreamAlias("ip")
	private String ip;
	
	public int getLogId() {
		return logId;
	}
	public void setLogId(int logId) {
		this.logId = logId;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	@Override
	public String toString() {
		return "UserLog [logId=" + logId + ", ip=" + ip + "]";
	}
	
	
}


常用注解:

@XStreamAlias 别名注解;

@XStreamAsAttribute 转换成属性,而不是子标签

@XStreamOmitField 忽略字段

@XStreamConverter 注入转换器(转换器要求无参构造器)

@XStreamImplicit 忽略集合名称标签



转换器

package cn.framework.t2;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

import com.thoughtworks.xstream.converters.ConversionException;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class DateConverter1 implements Converter{
	private Locale locale;
	
	public DateConverter1(){
		super();
		this.locale=locale.SIMPLIFIED_CHINESE;
	}
	
	//判断需要转换的类型
	@Override
	public boolean canConvert(Class clazz) {
		// TODO Auto-generated method stub
		return Date.class.isAssignableFrom(clazz);
	}

	//编写java对象到xml的逻辑
	@Override
	public void marshal(Object value, HierarchicalStreamWriter writer,
			MarshallingContext context) {
		DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,this.locale);
		writer.setValue(formatter.format(value));
	}

	//编写xml到java对象的逻辑
	@Override
	public Object unmarshal(HierarchicalStreamReader reader,
			UnmarshallingContext context) {
		GregorianCalendar calendar = new GregorianCalendar();
		DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,this.locale);
		try{
			calendar.setGregorianChange(formatter.parse(reader.getValue()));
		}catch(ParseException e){
			throw new ConversionException(e.getMessage(),e);
		}
		return calendar.getGregorianChange();
	}

}

注意:与上一篇的转换器不同,这里构造器使用的是无参数的方式。


package cn.framework.t2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Locale;

import org.apache.log4j.Logger;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class XStreamUtils1 {
	private static final Logger logger=Logger.getLogger("cn.framework.t1.XStreamUtils1");
	
	private static XStream xstream;
	static{
		logger.info("init xstream ...");
		xstream=new XStream(new DomDriver());
		
		//加载指定有XStream注解的bean
//		xstream.processAnnotations(User.class);
		
		//自动加载所有XStream注解的bean,与上面的区别是上面加载指定的bean
		xstream.autodetectAnnotations(true);
	}
	
	public static void objectToXML(User user) throws FileNotFoundException{
		logger.info("do objectToXML ...");
		FileOutputStream fileOutputStream = new FileOutputStream("e:/out/xstream_user.xml");
		xstream.toXML(user, fileOutputStream);
	}
	
	public static void xmlToObject() throws FileNotFoundException{
		logger.info("do xmlToObject ...");
		FileInputStream input = new FileInputStream("e:/out/xstream_user.xml");
		User user=(User) xstream.fromXML(input);
		System.out.println(user);
	}
	
	
}

测试:

package cn.framework.t2;

import java.io.FileNotFoundException;
import java.text.ParseException;
import java.util.Date;

public class Test1 {

	public static void main(String[] args) throws FileNotFoundException, ParseException {
		User user = new User();
		user.setLastVisted(new Date());
		user.setPwd("123456");
		user.setUserId(1);
		user.setUserName("aaa");
		
		
		UserLog userLog = new UserLog();
		userLog.setIp("127.0.0.1");
		userLog.setLogId(1);
		user.getLogs().add(userLog);
		
		UserLog userLog1 = new UserLog();
		userLog1.setIp("127.0.0.1");
		userLog1.setLogId(2);
		user.getLogs().add(userLog1);
		
		XStreamUtils1.objectToXML(user);
		
//		XStreamUtils1.xmlToObject();
		
	}

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值