xstreamにおけるいくつかの注釈の意味と使い方

5189 ワード

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に対して表示を削除し、間のノード要素のみを表示
@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;

よく使うのはこれだけで、ほかのことはまた討論して勉強しましょう.