xStream不仅对XML的转换非常友好,而且提供annotation注解,可以在JavaBean中完成对xml节点、属性的描述。
隐式集合
当我们使用集合类时不想显示集合,只显示里面的元素即可.
使用隐式集合前:
<list>
<element />
<element />
<list>
使用隐式集合: xstream.addImplicitCollection(Person.class, "list");
使用隐式集合后:
<element />
<element />
下载jar包
可以在maven上面下载如下jar包:
xstream-1.3.1.jar
xpp3-1.1.3.3.jar
XStream常用注释
@XStreamAlias(“message”) 别名注解
作用目标: 类,字段
@XStreamImplicit 隐式集合 是指在集合中不显示集合的名称
@XStreamImplicit(itemFieldName=”part”)
作用目标: 集合字段
@XStreamConverter(SingleValueCalendarConverter.class) 注入转换器
作用目标: 对象
@XStreamAsAttribute 转换成属性
作用目标: 字段
@XStreamOmitField 忽略字段
作用目标: 字段
简单Demo
User类
package cn.xiaoyu.xstream.domain;
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.XStreamImplicit;
@XStreamAlias("user") // 设置User类在xml中的别名
public class User {
private Integer id;
@XStreamAsAttribute() // 将name设置为XML user元素的attribute
private String name;
private Date birth;
@XStreamImplicit(itemFieldName="role") // 将这个字段从xml中去掉
private List<String> roles = new ArrayList<String>();
// @XStreamImplicit(itemFieldName="address") // 这儿和在Address.java上面添加@XStreamAlias("address")效果一样
private List<Address> addresses = new ArrayList<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public List<String> getRoles() {
return roles;
}
public void setRoles(List<String> roles) {
this.roles = roles;
}
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
public User(){}
public User(int id, String name, Date birth) {
super();
this.id = id;
this.name = name;
this.birth = birth;
}
}
Address类
package cn.xiaoyu.xstream.domain;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("address")
public class Address {
private String addr;
private int number;
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public Address() {}
public Address(String addr, int number) {
super();
this.addr = addr;
this.number = number;
}
}
Demo类
package cn.xiaoyu.xstream.demo;
import java.util.Date;
import com.thoughtworks.xstream.XStream;
import cn.xiaoyu.xstream.domain.Address;
import cn.xiaoyu.xstream.domain.User;
public class Demo {
public static void main(String[] args) {
// 初始化user对象
User user = new User(1,"bubu",new Date());
user.getRoles().add("coder");
user.getRoles().add("student");
user.getAddresses().add(new Address("shenzhen",1234));
user.getAddresses().add(new Address("anqing",5678));
// 将对象转换成xml
XStream xStream = new XStream();
// 这句和@XStreamAlias("user")等效
// xStream.alias("user",User.class);
// xStream.alias("address",Address.class);
xStream.setMode(XStream.NO_REFERENCES);
// 这句和@XStreamImplicit()等效
// xStream.addImplicitCollection(User.class, "addresses");
// 这句和@XStreamAsAttribute()
// xStream.useAttributeFor(User.class,"name");
//注册使用了注解的VO
xStream.processAnnotations(new Class[]{User.class,Address.class});
String xml = xStream.toXML(user);
System.out.println(xml);
// 将xml转换为User对象
XStream xs = new XStream();
// 这句和@XStreamAlias("user")等效
// xs.alias("user",User.class);
// xs.alias("address",Address.class);
xs.setMode(XStream.NO_REFERENCES);
// 这句和@XStreamImplicit()等效
// xs.addImplicitCollection(User.class, "addresses");
// 这句和@XStreamAsAttribute()
// xs.useAttributeFor(User.class,"name");
xs.processAnnotations(new Class[]{User.class,Address.class});
User bubu = (User) xs.fromXML(xml);
System.out.println(bubu.getAddresses().get(0).getNumber()+"---"+bubu.getName());
}
}
注:
在生成xml时候出现:Element roles of type java.lang.String is not defined as field in type cn.xiaoyu.xstream.domain.User
或者在解析xml的时候出现:com.thoughtworks.xstream.mapper.CannotResolveClassException: user : user
两个异常在使用注释的时候可能是因为没有注册使用了注解的VO,
在不使用注释的情况可能是因为某些别名,隐式集合没有设置正确,仔细检查一下。