作者:黃少存,叩丁狼高級講師。原創(chuàng)文章,轉載請注明出處。
上一節(jié)咱們講解了在 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, "業(yè)務員"));
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>業(yè)務員</name>
</role>
</user>
OK,到這里XStream使用注解自定義生成的標簽和包,屬性設置就搞定了,不過大家有沒有發(fā)現(xiàn)一個問題,就是咱們現(xiàn)在都是在用一個對象轉成 xml 或者是使用 xml 轉為對象,如果我們需要在一個 xml 中存入多個對象,解析多個對象怎么辦呢?請看下一節(jié) XStream 的對象流.

WechatIMG7.jpeg