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;


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








  • 15
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值