作者:黄少存,叩丁狼高级讲师。原创文章,转载请注明出处。
上一节咱们讲解了在 XStream 中如何自定义标签名和包名等操作,但是需要在 Java 代码中使用调用方法的方式去设置这些别名,用起来比较麻烦,接下来咱们就使用注解的方式来解决.
之前的操作
- 修改类对应别名: xstream.alias("user", User.class);
- 将字段作为属性:xstream.useAttributeFor(User.class, "id");
- 修改字段名:xstream.aliasField("name", User.class, "username");
- 隐藏集合生成标签: xstream.addImplicitCollection(User.class, "roles");
常用注解
- @XStreamAliasType(value="要修改成的全限定名"): 包名修改
- @XStreamAlias("user") : 修改类,字段,属性别名
- @XStreamAsAttribute : 将字段作为属性
- @XStreamImplicit : 隐藏集合或数组属性
- @XStreamOmitField : 忽略字段,不生成标签
常用注解都比较好理解,接下来咱们就来写个例子,看下效果
例子
模型
@Getter
@Setter
@ToString
@NoArgsConstructor
// 修改包名
@XStreamAliasType(value = "cn.wolfcode.xstream.annotation.User")
// 修改标签名为user
@XStreamAlias("user")
public class User {
@XStreamAsAttribute // 设置为user标签的属性
private Long id;
@XStreamAlias("name") // 修改属性生成的标签名为name
private String username;
@XStreamOmitField // 不生成标签
private Integer age;
@XStreamImplicit // 集合属性不生成标签
private List<Role> roles = new ArrayList<>();
public User(Long id, String username, Integer age) {
this.id = id;
this.username = username;
this.age = age;
}
}
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@XStreamAlias("role")
class Role {
@XStreamAsAttribute // 设置为role标签的属性
private Long id;
private String name;
}
这是贴了标签的模型,接下来就是转换了,不过不能直接像之前那样去转换,还需要让 XStream 去解析注解,解析注解的方式请看解析注解
解析注解
//解析注解,xml转对象时使用
xStream对象.processAnnotations(注解类);
//自动检测注解(在对象转xml中有用)
xStream对象.autodetectAnnotations(true);
好了,知道怎么解析注解之后,咱们就可以来解析 User 类的注解,然后转化 User 对象为 xml 了,不啰嗦,上代码.
@Test
public void testUser() throws Exception {
XStream xStream = new XStream(new StaxDriver());
// 自动解析注解
xStream.autodetectAnnotations(true);
User user = new User(1L, "willie", 18);
user.getRoles().add(new Role(1L, "管理员"));
user.getRoles().add(new Role(2L, "业务员"));
String xml = xStream.toXML(user);
//将字符串xml存到磁盘文件中,详情看
TransformerUtil.transform(xml,new File("user.xml"));
}
xml存入磁盘中
得到的xml如下
<?xml version="1.0" encoding="UTF-8"?>
<user id="1">
<name>willie</name>
<role id="1">
<name>管理员</name>
</role>
<role id="2">
<name>业务员</name>
</role>
</user>
OK,到这里XStream使用注解自定义生成的标签和包,属性设置就搞定了,不过大家有没有发现一个问题,就是咱们现在都是在用一个对象转成 xml 或者是使用 xml 转为对象,如果我们需要在一个 xml 中存入多个对象,解析多个对象怎么办呢?请看下一节 XStream 的对象流.