zoukankan      html  css  js  c++  java
  • XStream中几个注解的含义和用法

    转自:http://blog.csdn.net/robert_mm/article/details/8459879

    XStream是个很强大的工具,能将java对象和xml之间相互转化。xstream不在意java类中成员变量是私有还是公有,也不在乎是否有默认构造函数。它调用方式也非常简单:从xml对象转化为java对象,使用fromXML()方法;从java对象序列化为xml,toXML()即可,很方便。xstream也支持注解方式,这些都是为了简化输出而设计,下面为大家简单说一下这几个注解的含义和用法。

    1. 当没有任何注解情况下

    [java] view plain copy
     
    1. public class Cat {    
    2.     //名字    
    3.     private String name;    
    4.     //大小    
    5.     private Integer age;    
    6.     //玩具球  球具有颜色属性    
    7.     private List<Ball> balls;    
    8.         
    9.     Cat(String name,Integer age,List<Ball> balls){    
    10.         this.name = name;    
    11.         this.age = age;    
    12.         this.balls=balls;    
    13.     }    
    14.     //getter/setter方法 为了赋值使用    

    其中Ball定义如下:

    [java] view plain copy
     
    1. public class Ball {  
    2.     //颜色  
    3.     private String color;  
    4.   
    5.     Ball(String color){  
    6.         this.color = color;  
    7.     }  

    没有任何注解,输出如下:

    [java] view plain copy
     
    1. public static void main(String[] args) throws Exception{  
    2.         //初始化cat  
    3.         List<Ball> balls = new ArrayList<Ball>();  
    4.         balls.add(new Ball("red"));  
    5.         Cat cat = new Cat("馄饨",1,balls);  
    6.         //初始化结束  
    7.         //为了方便查找 将文件制定到D盘cat.xml中  
    8.         FileOutputStream fout = new FileOutputStream("D:/cat.xml");  
    9.         XStream xs = new XStream();  
    10.         xs.toXML(cat,fout);  
    11.     }<span style="font-size:14px;">  
    12. </span>  

    得到Cat.xml如下

    [java] view plain copy
     
    1. <com.timejob.node.Cat>  
    2.   <name>馄饨</name>  
    3.   <age>1</age>  
    4.   <balls>  
    5.     <com.timejob.node.Ball>  
    6.       <color>red</color>  
    7.     </com.timejob.node.Ball>  
    8.   </balls>  
    9. </com.timejob.node.Cat>  


    1. @XStreamAlias("cat") 等同于 xstream.alias("cat", Cat.class); 

    [java] view plain copy
     
    1. @XStreamAlias("cat")  //here   
    2. public class Cat {  
    3.     //名字  
    4.     private String name;  
    5.     //大小  
    6.     private Integer age;  
    7.     //玩具球  球具有颜色属性  
    8.     private List<Ball> balls;  

    我们需要明确给出,哪个类的注解需要被激活:

    [java] view plain copy
     
    1. public static void main(String[] args) throws Exception{  
    2.         //初始化cat  
    3.         List<Ball> balls = new ArrayList<Ball>();  
    4.         balls.add(new Ball("red"));  
    5.         Cat cat = new Cat("馄饨",1,balls);  
    6.         //初始化结束  
    7.         //为了方便查找 将文件制定到D盘cat.xml中  
    8.         FileOutputStream fout = new FileOutputStream("D:/cat.xml");  
    9.         XStream xs = new XStream();  
    10.         //xs.alias("cat", Cat.class); //等同于 @XStreamAlias("cat")  
    11.         xs.processAnnotations(Cat.class);//将Cat.class类上的注解将会使用  
    12.         xs.toXML(cat,fout);  
    13.     }  

    当我们在Cat类名使用该注解时,表明该类序列化为xml时,类名com.timejob.node.Cat将替换成cat输出,这样使得xml更清晰简短:

    [java] view plain copy
     
    1. <cat>  
    2.   <name>馄饨</name>  
    3.   <age>1</age>  
    4.   <balls>  
    5.     <com.timejob.node.Ball>  
    6.       <color>red</color>  
    7.     </com.timejob.node.Ball>  
    8.   </balls>  
    9. </cat>  


    2. XStreamAsAttribute 作用是将类内成员作为父节点属性输出,等同于xstream.useAttributeFor(Cat.class, "name")

    [java] view plain copy
     
    1. @XStreamAlias("cat")  
    2. public class Cat {  
    3.     //名字  
    4.     @XStreamAsAttribute // here  将name作为Cat属性输出在父节点  
    5.     private String name;  
    6.     //大小  
    7.     private Integer age;  
    8.     //玩具球  球具有颜色属性  
    9.     private List<Ball> balls;  
    10.       

    其他代码保持不变,输出后cat.xml如下:

    [java] view plain copy
     
    1. <cat name="馄饨">  
    2.   <age>1</age>  
    3.   <balls>  
    4.     <com.timejob.node.Ball>  
    5.       <color>red</color>  
    6.     </com.timejob.node.Ball>  
    7.   </balls>  
    8. </cat>  

    我们看到name属性已经作为 cat的属性输出在根节点上

    3. @XStreamAlias 作用就是将属性按照别名输出,等同于xstream.aliasField("catAge", Cat.class, "age");

    [java] view plain copy
     
    1. @XStreamAlias("cat")  
    2. public class Cat {  
    3.     //名字  
    4.     @XStreamAsAttribute  
    5.     private String name;  
    6.     //大小  
    7.     @XStreamAlias("catAge")  //here  
    8.     private Integer age;  
    9.     //玩具球  球具有颜色属性  
    10.     private List<Ball> balls;  

    得到cat.xml文件如下:

    [java] view plain copy
     
    1. <cat name="馄饨">  
    2.   <catAge>1</catAge>  
    3.   <balls>  
    4.     <com.timejob.node.Ball>  
    5.       <color>red</color>  
    6.     </com.timejob.node.Ball>  
    7.   </balls>  
    8. </cat>  

    4.对于集合常用的注解 @XStreamImplicit 去除<Balls></Balls>显示,只显示之间的<Ball></Ball>节点元素

    [java] view plain copy
     
    1. @XStreamAlias("cat")  
    2. public class Cat {  
    3.     //名字  
    4.     @XStreamAsAttribute  
    5.     private String name;  
    6.     //大小  
    7.     @XStreamAlias("catAge")  
    8.     private Integer age;  
    9.     //玩具球  球具有颜色属性  
    10.     @XStreamImplicit    //here  
    11.     private List<Ball> balls;  

    此时输出如下:

    [java] view plain copy
     
    1. <cat name="馄饨">  
    2.   <catAge>1</catAge>  
    3.   <com.timejob.node.Ball>  
    4.     <color>red</color>  
    5.   </com.timejob.node.Ball>  
    6. </cat>  

    这样看起来就更加简洁了。

    4.还有几个注解,都是比较好理解的,如@XStreamOmitField 表明该属性不会被序列化到xml中。

    [java] view plain copy
     
    1. @XStreamAlias("cat")  
    2. public class Cat {  
    3.     //名字  
    4.     @XStreamAsAttribute  
    5.     private String name;  
    6.     //大小  
    7.     @XStreamAlias("catAge")  
    8.     private Integer age;  
    9.     //玩具球  球具有颜色属性  
    10.     @XStreamImplicit  
    11.     private List<Ball> balls;  
    12.     @XStreamOmitField        //here  
    13.     private String noCare;  

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

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    以下为原创:

    @XStreamImplicit(itemFieldName="ballName")
    itemFieldName支持修改list中每个元素的节点的名字,如下:

    、、、、、、、、、、、、、、、
    import com.thoughtworks.xstream.XStream;

    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.List;

    public class Test {
    public static void main(String[] args) {
    //初始化cat
    List<Ball> balls = new ArrayList<Ball>();
    balls.add(new Ball("red"));
    balls.add(new Ball("blue"));
    Cat cat = new Cat("馄饨",1,balls);
    //初始化结束
    //为了方便查找 将文件制定到D盘cat.xml中
    FileOutputStream fout = null;
    try {
    fout = new FileOutputStream("D:/cat.xml");
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    XStream xs = new XStream();
    xs.processAnnotations(Cat.class);//将Cat.class类上的注解将会使用
    xs.toXML(cat,fout);
    }
    }

    将输出:

    <com.jianwu.boss.domain.Cat>
    <name>馄饨</name>
    <age>1</age>
    <ballName>
    <color>red</color>
    </ballName>
    <ballName>
    <color>blue</color>
    </ballName>
    </com.jianwu.boss.domain.Cat>

    注意,

    xs.processAnnotations(Cat.class);//将Cat.class类上的注解将会使用
    这句一定要加上,这句才能使注解生效。

  • 相关阅读:
    Js前端路由管理器函数
    js前端登录js脚本
    docker部署certbot与nginx来获取ssl证书添加https及自动更新
    spring boot不同版本的优雅关闭(graceful shutdown)和在windows下winsw服务方式运行的配置
    php下载
    在k8s中导出jvm内存错误dump文件到OSS
    基于alpine构建jdk镜像遇到的坑
    UML建模综述
    Web安全攻防渗透测试实战指南之工具
    数字签名、数字证书是什么?
  • 原文地址:https://www.cnblogs.com/YuyuanNo1/p/8038337.html
Copyright © 2011-2022 走看看