本例使用XStream生成一个xml文件,再发序列化xml文件内容。
XStream是一个简单的类库,可以序列化对象到xml,还可以将xml还原为对象。
XStream官网:http://xstream.codehaus.org/ 附件提供XStream和xpp3相关的jar下载:
xstream-1.2.2.jar xpp3-1.1.3.3_min.jar 为了使用XStream,需要对其初始化,初始化方法有两种:
- XStream xstream = new XStream(); 这种方式的初始化需要xpp3-[version].jar的支持。xpp是一个快速解析XML文件的解析器。
- XStream xstream = new XStream(new DomDriver()); XStream xStream = new XStream(new DomDriver("utf-8")) 这种方式不需要依赖XPP3.jar的支持,它是使用标准的JAXP DOM来解析它。
同时这里对mode参数做个简单的说明:
在XStream序列化或反序列化对象时,它会创建两个类MarshallingContext和UnmarshallingContext,由它们来处理数据,以及委派合适的转换器。XStream提供了三对上下文的缺省实现,它们之间有着细微的差别。缺省值可以通过方法XStream.setMode()来改变,需要传递下面参数中的一个:
- XStream.XPATH_RELATIVE_REFERENCES:(缺省)通过XPath引用来标识重复的引用,使用相对路径表示。
- XStream.XPATH_ABSOLUTE_REFERENCES:通过XPath引用来标识重复的引用,使用绝对路径表示。
- XStream.ID_REFERENCES:使用ID引用来标识重复的引用。在一些场合(手写XML时),将会更易于操作
- XStream.NO_REFERENCES:这种情况将失去对图形对象的支持,仅把对象看作为树型结构。重复的引用被视作两个不同的对象,循环引用会导致异常产生。相对于上面两种模式,这种模式速度会更快,占用内存会更
这个例子包含有3个简单的java类,其中两个是javabean,另外一个是逻辑处理类。
1. <span style="white-space: normal; background-color: #ffffff;">package
2.
3. import
4. import
5. import
6.
7. import
8. import
9.
10. /**
11. * User: Rojer
12. * Date: 12-3-1
13. * Time: 下午4:58
14. * To change this template use File | Settings | File Templates.
15. */
16. //设置Person类在xml中的别名
17. @XStreamAlias("person")
18. public class
19. //将name设置为XML person 元素的 attribute
20. @XStreamAsAttribute()
21. private
22. private int
23. //将此字段名在XML中去掉
24. @XStreamImplicit()
25. private List<Address> addresses = new
26.
27. public
28. return
29. }
30.
31. public void
32. this.addresses = addresses;
33. }
34.
35. public
36. return
37. }
38.
39. public void
40. this.name = name;
41. }
42.
43. public int
44. return
45. }
46.
47. public void setPhoneNuber(int
48. this.phoneNuber = phoneNuber;
49. }
50.
51.
52. }
Adress
1. package
2.
3. import
4.
5. /**
6. * User: Rojer
7. * Date: 12-3-1
8. * Time: 下午5:00
9. * To change this template use File | Settings | File Templates.
10. */
11. @XStreamAlias("address")
12. public class
13. private
14. private int
15.
16. public
17. return
18. }
19.
20. public void
21. this.street = street;
22. }
23.
24. public int
25. return
26. }
27.
28. public void setHouseNo(int
29. this.houseNo = houseNo;
30. }
31. }
测试类
1. package
2.
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11.
12. import
13. import
14.
15. /**
16. * User: Rojer
17. * Date: 12-3-1
18. * Time: 下午4:48
19. * To change this template use File | Settings | File Templates.
20. */
21. public class
22.
23. public static void
24. String res=toXML();
25. toEntity(res);
26. }
27.
28. public static void
29. new
30. // 这句和@XStreamAlias("person")等效
31. // xs.alias("person",Person.class);
32. // xs.alias("address",Address.class);
33. xs.setMode(XStream.NO_REFERENCES);
34. // 这句和@XStreamImplicit()等效
35. // xs.addImplicitCollection(Person.class,"addresses");
36. // 这句和@XStreamAsAttribute()
37. // xs.useAttributeFor(Person.class, "name");
38. //注册使用了注解的VO
39. new Class[]{Person.class,Address.class});
40. Person person = (Person)xs.fromXML(inputXML);
41. 0).getHouseNo()+person.getName());
42.
43.
44.
45. }
46.
47. public static
48. new
49. new
50. "rojer");
51. 999);
52. new
53. 888);
54. "newyork");
55. new
56. 76767);
57. "toyo");
58. person.getAddresses().add(address1);
59. person.getAddresses().add(address2);
60. // xStream.alias("person", Person.class);
61. // xStream.alias("address",Address.class);
62. xStream.setMode(XStream.NO_REFERENCES);
63. // xStream.addImplicitCollection(Person.class, "addresses");
64. // xStream.useAttributeFor(Person.class,"name");
65. //注册使用了注解的VO
66. new Class[]{Person.class,Address.class});
67. String xml = xStream.toXML(person);
68.
69. System.out.println(xml);
70. return
71. }
72. }
测试结果如下
1. <person name="rojer">
2. <phoneNuber>999</phoneNuber>
3. <address>
4. <street>newyork</street>
5. <houseNo>888</houseNo>
6. </address>
7. <address>
8. <street>toyo</street>
9. <houseNo>76767</houseNo>
10. </address>
11. </person>
12. 888rojer
如果去掉Person类的@XStreamImplicit()注解,生成的XML如下
1. <person name="rojer">
2. <phoneNuber>999</phoneNuber>
3. <addresses>
4. <address>
5. <street>newyork</street>
6. <houseNo>888</houseNo>
7. </address>
8. <address>
9. <street>toyo</street>
10. <houseNo>76767</houseNo>
11. </address>
12. </addresses>
13. </person>
14. 888rojer
其字段addresses 会被写入到XML中。