1. 程式人生 > >xstream中幾個註解的含義和用法

xstream中幾個註解的含義和用法

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;
	}
沒有任何註解,輸出如下:
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);
	}
得到Cat.xml如下
<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;
常用的就這麼幾個,其他的再討論和學習吧。