XStream是个很强大的工具,能将Java对象和xml之间相互转化。xstream不在乎java类中成员变量是私有仍是公有,也不在意是否有默认构造函数。它调用方式也很是简单:从xml对象转化为java对象,使用fromXML()方法;从java对象序列化为xml,toXML()便可,很方便。xstream也支持注解方式,这些都是为了简化输出而设计,下面为你们简单说一下这几个注解的含义和用法。java
1. 当没有任何注解状况下node
- 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;
- }
-
其中Ball定义以下:函数
- public class Ball {
-
- private String color;
-
- Ball(String color){
- this.color = color;
- }
没有任何注解,输出以下:工具
- public static void main(String[] args) throws Exception{
-
- List<Ball> balls = new ArrayList<Ball>();
- balls.add(new Ball("red"));
- Cat cat = new Cat("馄饨",1,balls);
-
-
- FileOutputStream fout = new FileOutputStream("D:/cat.xml");
- XStream xs = new XStream();
- xs.toXML(cat,fout);
- }<span style="font-size:14px;">
- </span>
获得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); this
- @XStreamAlias("cat")
- public class Cat {
-
- private String name;
-
- private Integer age;
-
- private List<Ball> balls;
咱们须要明确给出,哪一个类的注解须要被激活:spa
- public static void main(String[] args) throws Exception{
-
- List<Ball> balls = new ArrayList<Ball>();
- balls.add(new Ball("red"));
- Cat cat = new Cat("馄饨",1,balls);
-
-
- FileOutputStream fout = new FileOutputStream("D:/cat.xml");
- XStream xs = new XStream();
-
- xs.processAnnotations(Cat.class);
- xs.toXML(cat,fout);
- }
当咱们在Cat类名使用该注解时,代表该类序列化为xml时,类名com.timejob.node.Cat将替换成cat输出,这样使得xml更清晰简短:.net
- <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
- private String name;
-
- private Integer age;
-
- private List<Ball> balls;
-
其余代码保持不变,输出后cat.xml以下: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")
- 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
- 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
- private String noCare;
经常使用的就这么几个,其余的再讨论和学习吧。