xstream中幾個註解的含義和用法
阿新 • • 發佈:2019-01-25
XStream是個很強大的工具,能將java物件和xml之間相互轉化。xstream不在意java類中成員變數是私有還是公有,也不在乎是否有預設建構函式。它呼叫方式也非常簡單:從xml物件轉化為java物件,使用fromXML()方法;從java物件序列化為xml,toXML()即可,很方便。xstream也支援註解方式,這些都是為了簡化輸出而設計,下面為大家簡單說一下這幾個註解的含義和用法。
1. 當沒有任何註解情況下
public class Cat { //名字 private String name; //大小 private Integer age; //玩具球 球具有顏色屬性 private List<Ball> balls; Cat(String name,Integer age,List<Ball> balls){ this.name = name; this.age = age; this.balls=balls; } //getter/setter方法 為了賦值使用
其中Ball定義如下:
public class Ball {
//顏色
private String color;
Ball(String color){
this.color = color;
}
沒有任何註解,輸出如下:
得到Cat.xml如下public static void main(String[] args) throws Exception{ //初始化cat List<Ball> balls = new ArrayList<Ball>(); balls.add(new Ball("red")); Cat cat = new Cat("餛飩",1,balls); //初始化結束 //為了方便查詢 將檔案制定到D盤cat.xml中 FileOutputStream fout = new FileOutputStream("D:/cat.xml"); XStream xs = new XStream(); xs.toXML(cat,fout); }
<com.timejob.node.Cat>
<name>餛飩</name>
<age>1</age>
<balls>
<com.timejob.node.Ball>
<color>red</color>
</com.timejob.node.Ball>
</balls>
</com.timejob.node.Cat>
1. @XStreamAlias("cat") 等同於 xstream.alias("cat", Cat.class);
@XStreamAlias("cat") //here
public class Cat {
//名字
private String name;
//大小
private Integer age;
//玩具球 球具有顏色屬性
private List<Ball> balls;
我們需要明確給出,哪個類的註解需要被啟用:
public static void main(String[] args) throws Exception{
//初始化cat
List<Ball> balls = new ArrayList<Ball>();
balls.add(new Ball("red"));
Cat cat = new Cat("餛飩",1,balls);
//初始化結束
//為了方便查詢 將檔案制定到D盤cat.xml中
FileOutputStream fout = new FileOutputStream("D:/cat.xml");
XStream xs = new XStream();
//xs.alias("cat", Cat.class); //等同於 @XStreamAlias("cat")
xs.processAnnotations(Cat.class);//將Cat.class類上的註解將會使用
xs.toXML(cat,fout);
}
當我們在Cat類名使用該註解時,表明該類序列化為xml時,類名com.timejob.node.Cat將替換成cat輸出,這樣使得xml更清晰簡短:
<cat>
<name>餛飩</name>
<age>1</age>
<balls>
<com.timejob.node.Ball>
<color>red</color>
</com.timejob.node.Ball>
</balls>
</cat>
2. XStreamAsAttribute 作用是將類內成員作為父節點屬性輸出,等同於xstream.useAttributeFor(Cat.class, "name")
@XStreamAlias("cat")
public class Cat {
//名字
@XStreamAsAttribute // here 將name作為Cat屬性輸出在父節點
private String name;
//大小
private Integer age;
//玩具球 球具有顏色屬性
private List<Ball> balls;
其他程式碼保持不變,輸出後cat.xml如下:
<cat name="餛飩">
<age>1</age>
<balls>
<com.timejob.node.Ball>
<color>red</color>
</com.timejob.node.Ball>
</balls>
</cat>
我們看到name屬性已經作為 cat的屬性輸出在根節點上
3. @XStreamAlias 作用就是將屬性按照別名輸出,等同於xstream.aliasField("catAge", Cat.class, "age");
@XStreamAlias("cat")
public class Cat {
//名字
@XStreamAsAttribute
private String name;
//大小
@XStreamAlias("catAge") //here
private Integer age;
//玩具球 球具有顏色屬性
private List<Ball> balls;
得到cat.xml檔案如下:
<cat name="餛飩">
<catAge>1</catAge>
<balls>
<com.timejob.node.Ball>
<color>red</color>
</com.timejob.node.Ball>
</balls>
</cat>
4.對於集合常用的註解 @XStreamImplicit 去除<Balls></Balls>顯示,只顯示之間的<Ball></Ball>節點元素
@XStreamAlias("cat")
public class Cat {
//名字
@XStreamAsAttribute
private String name;
//大小
@XStreamAlias("catAge")
private Integer age;
//玩具球 球具有顏色屬性
@XStreamImplicit //here
private List<Ball> balls;
此時輸出如下:
<cat name="餛飩">
<catAge>1</catAge>
<com.timejob.node.Ball>
<color>red</color>
</com.timejob.node.Ball>
</cat>
這樣看起來就更加簡潔了。4.還有幾個註解,都是比較好理解的,如@XStreamOmitField 表明該屬性不會被序列化到xml中。
@XStreamAlias("cat")
public class Cat {
//名字
@XStreamAsAttribute
private String name;
//大小
@XStreamAlias("catAge")
private Integer age;
//玩具球 球具有顏色屬性
@XStreamImplicit
private List<Ball> balls;
@XStreamOmitField //here
private String noCare;
常用的就這麼幾個,其他的再討論和學習吧。