实体类:
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 注入转换器(转换器要求无参构造器)
转换器
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(); } }