xstream中几个注解的含义和用法

来源:互联网 发布:知乎 电影书籍推荐 编辑:程序博客网 时间:2024/05/22 03:45

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{//初始化catList<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{//初始化catList<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 {    //名字@XStreamAsAttributeprivate String name;//大小@XStreamAlias("catAge")  //hereprivate 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 {    //名字@XStreamAsAttributeprivate String name;//大小@XStreamAlias("catAge")private Integer age;    //玩具球  球具有颜色属性@XStreamImplicit    //hereprivate 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 {    //名字@XStreamAsAttributeprivate String name;//大小@XStreamAlias("catAge")private Integer age;    //玩具球  球具有颜色属性@XStreamImplicitprivate List<Ball> balls;@XStreamOmitField        //hereprivate String noCare;


常用的就这么几个,其他的再讨论和学习吧。








原创粉丝点击