java 序列化反序列化xml【使用XStream类库】

举报
小傅哥 发表于 2021/04/23 00:32:16 2021/04/23
【摘要】 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是一个简单的类库,可以序列化对象到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来解析它


应:ejbtimer的要求增加了数组对象的序列化测试,不过我测试时没有设置mode参数也可以正常序列化。
同时这里对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:这种情况将失去对图形对象的支持,仅把对象看作为树型结构。重复的引用被视作两个不同的对象,循环引用会导致异常产生。相对于上面两种模式,这种模式速度会更快,占用内存会更

下面简单的例子包括三个类:UserBean.java,ContactBean.java,XstreamTestMain.java代码如下: 
xstream测试类: XstreamTestMain.java



  
  1. package michael.xstream;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Map.Entry;
  10. import com.thoughtworks.xstream.XStream;
  11. import com.thoughtworks.xstream.io.xml.DomDriver;
  12. /**
  13. * Xtream 序列化及反序列化
  14. * @blog http://sjsky.iteye.com
  15. * @author Michael
  16. */
  17. public class XtreamTestMain {
  18. /**
  19. * @param args
  20. */
  21. public static void main(String[] args) {
  22. UserBean userBean = initBean();
  23. // 依懒xpp解析器
  24. // XStream xStream = new XStream();
  25. // 运用标准的DOM解析器
  26. // XStream xStream = new XStream(new DomDriver());
  27. // 指定编码格式
  28. XStream xStream = new XStream(new DomDriver("utf-8"));
  29. // xStream.setMode(XStream.NO_REFERENCES);
  30. // 直接指定修改生成XML的节点名称
  31. xStream.alias("UserBean", UserBean.class);
  32. String xml = xStream.toXML(userBean);
  33. System.out.println("BEAN转化为XML 字符串-----------------------------");
  34. System.out.println(xml);
  35. System.out.println("XML转化为BEAN-----------------------------");
  36. UserBean parseBean = (UserBean) xStream.fromXML(xml);
  37. System.out.println("userName:" + parseBean.getUserName());
  38. System.out.println("age:" + parseBean.getAge());
  39. System.out.println("birthday:" + parseBean.getBirthday());
  40. for (String str : parseBean.getAddresList()) {
  41. System.out.println("addres:" + str);
  42. }
  43. for (Entry<String, String> entry : parseBean.getNickNameMap()
  44. .entrySet()) {
  45. System.out.println("nick name:" + entry.getKey() + "<->"
  46. + entry.getValue());
  47. }
  48. ContactBean contact = parseBean.getContact();
  49. System.out.println("postcode:" + contact.getPostCode());
  50. System.out.println("telephone:" + contact.getTelephone());
  51. System.out.println("mobile:" + contact.getMobile());
  52. System.out.println("email:" + contact.getEmail());
  53. System.out.println("BEAN转化为XML文件-----------------------------");
  54. try {
  55. FileOutputStream fos = new FileOutputStream("d:/test/userbean.xml");
  56. xStream.toXML(userBean, fos);
  57. } catch (Exception ex) {
  58. ex.printStackTrace();
  59. }
  60. System.out.println("XML文件转化为BEAN-----------------------------");
  61. UserBean parseFileBean = new UserBean();
  62. try {
  63. FileInputStream fis = new FileInputStream("d:/test/userbean.xml");
  64. parseFileBean = (UserBean) xStream.fromXML(fis, parseFileBean);
  65. System.out.println("parseFileBean->" + parseFileBean);
  66. } catch (Exception ex) {
  67. ex.printStackTrace();
  68. }
  69. }
  70. /**
  71. * @return test bean
  72. */
  73. private static UserBean initBean() {
  74. ContactBean contact = new ContactBean();
  75. contact.setPostCode("200000");
  76. contact.setTelephone("021-88888888");
  77. contact.setMobile("1891800xxxx");
  78. contact.setEmail("test@test.com");
  79. List<String> addressList = new ArrayList<String>();
  80. addressList.add("上海杨浦");
  81. addressList.add("江苏苏州");
  82. Map<String, String> nickNameMap = new HashMap<String, String>();
  83. nickNameMap.put("大大", "小小");
  84. nickNameMap.put("老公", "老婆");
  85. UserBean userBean = new UserBean();
  86. userBean.setUserName("michael");
  87. userBean.setAge(26);
  88. userBean.setBirthday(new Date());
  89. userBean.setAddresList(addressList);
  90. userBean.setNickNameMap(nickNameMap);
  91. userBean.setContact(contact);
  92. ContactBean contact1 = new ContactBean();
  93. contact1.setPostCode("200011");
  94. contact1.setTelephone("021-11111111");
  95. contact1.setMobile("13911111111");
  96. contact1.setEmail("contact1@test.com");
  97. ContactBean contact2 = new ContactBean();
  98. contact2.setPostCode("20002");
  99. contact2.setTelephone("021-22222222");
  100. contact2.setMobile("13922222222");
  101. contact2.setEmail("contact2@test.com");
  102. ContactBean[] contactArr = new ContactBean[] { contact1, contact2 };
  103. userBean.setContactArr(contactArr);
  104. return userBean;
  105. }
  106. }
  107. 测试UserBean:UserBean.java
  108. package michael.xstream;
  109. import java.util.ArrayList;
  110. import java.util.Date;
  111. import java.util.HashMap;
  112. import java.util.List;
  113. import java.util.Map;
  114. /**
  115. * @author Michael
  116. */
  117. public class UserBean {
  118. /**
  119. * 用户名称
  120. */
  121. private String userName;
  122. /**
  123. * 年龄
  124. */
  125. private Integer age;
  126. /**
  127. * 出生日期
  128. */
  129. private Date birthday;
  130. /**
  131. * 地址
  132. */
  133. private List<String> addresList = new ArrayList<String>();
  134. /**
  135. * 昵称
  136. */
  137. private Map<String, String> nickNameMap = new HashMap<String, String>();
  138. /**
  139. * 联系方式Bean
  140. */
  141. private ContactBean contact;
  142. /**
  143. * 测试对象数组
  144. */
  145. private ContactBean[] contactArr;
  146. /**
  147. * @return the userName
  148. */
  149. public String getUserName() {
  150. return userName;
  151. }
  152. /**
  153. * @return the age
  154. */
  155. public Integer getAge() {
  156. return age;
  157. }
  158. /**
  159. * @return the birthday
  160. */
  161. public Date getBirthday() {
  162. return birthday;
  163. }
  164. /**
  165. * @return the addresList
  166. */
  167. public List<String> getAddresList() {
  168. return addresList;
  169. }
  170. /**
  171. * @return the nickNameMap
  172. */
  173. public Map<String, String> getNickNameMap() {
  174. return nickNameMap;
  175. }
  176. /**
  177. * @return the contact
  178. */
  179. public ContactBean getContact() {
  180. return contact;
  181. }
  182. /**
  183. * @param pUserName the userName to set
  184. */
  185. public void setUserName(String pUserName) {
  186. userName = pUserName;
  187. }
  188. /**
  189. * @param pAge the age to set
  190. */
  191. public void setAge(Integer pAge) {
  192. age = pAge;
  193. }
  194. /**
  195. * @param pBirthday the birthday to set
  196. */
  197. public void setBirthday(Date pBirthday) {
  198. birthday = pBirthday;
  199. }
  200. /**
  201. * @param pAddresList the addresList to set
  202. */
  203. public void setAddresList(List<String> pAddresList) {
  204. addresList = pAddresList;
  205. }
  206. /**
  207. * @param pNickNameMap the nickNameMap to set
  208. */
  209. public void setNickNameMap(Map<String, String> pNickNameMap) {
  210. nickNameMap = pNickNameMap;
  211. }
  212. /**
  213. * @param pContact the contact to set
  214. */
  215. public void setContact(ContactBean pContact) {
  216. contact = pContact;
  217. }
  218. /**
  219. * @return the contactArr
  220. */
  221. public ContactBean[] getContactArr() {
  222. return contactArr;
  223. }
  224. /**
  225. * @param pContactArr the contactArr to set
  226. */
  227. public void setContactArr(ContactBean[] pContactArr) {
  228. contactArr = pContactArr;
  229. }
  230. }
  231. 测试ContactBean :ContactBean.java
  232. package com.test;
  233. /**
  234. * @author Michael
  235. */
  236. public class ContactBean {
  237. /**
  238. * 邮编
  239. */
  240. private String postCode;
  241. /**
  242. * 电话
  243. */
  244. private String telephone;
  245. /**
  246. * 手机
  247. */
  248. private String mobile;
  249. /**
  250. * email
  251. */
  252. private String email;
  253. /**
  254. * @return the postCode
  255. */
  256. public String getPostCode() {
  257. return postCode;
  258. }
  259. /**
  260. * @return the telephone
  261. */
  262. public String getTelephone() {
  263. return telephone;
  264. }
  265. /**
  266. * @return the mobile
  267. */
  268. public String getMobile() {
  269. return mobile;
  270. }
  271. /**
  272. * @return the email
  273. */
  274. public String getEmail() {
  275. return email;
  276. }
  277. /**
  278. * @param pPostCode the postCode to set
  279. */
  280. public void setPostCode(String pPostCode) {
  281. postCode = pPostCode;
  282. }
  283. /**
  284. * @param pTelephone the telephone to set
  285. */
  286. public void setTelephone(String pTelephone) {
  287. telephone = pTelephone;
  288. }
  289. /**
  290. * @param pMobile the mobile to set
  291. */
  292. public void setMobile(String pMobile) {
  293. mobile = pMobile;
  294. }
  295. /**
  296. * @param pEmail the email to set
  297. */
  298. public void setEmail(String pEmail) {
  299. email = pEmail;
  300. }
  301. }
  302. 运行测试代码,打印结果如下:
  303. 引用
  304. BEAN转化为XML 字符串-----------------------------
  305. <UserBean>
  306. <userName>michael</userName>
  307. <age>26</age>
  308. <birthday>2011-07-20 23:33:32.969 CST</birthday>
  309. <addresList>
  310. <string>上海杨浦</string>
  311. <string>江苏苏州</string>
  312. </addresList>
  313. <nickNameMap>
  314. <entry>
  315. <string>老公</string>
  316. <string>老婆</string>
  317. </entry>
  318. <entry>
  319. <string>大大</string>
  320. <string>小小</string>
  321. </entry>
  322. </nickNameMap>
  323. <contact>
  324. <postCode>200000</postCode>
  325. <telephone>021-88888888</telephone>
  326. <mobile>1891800xxxx</mobile>
  327. <email>test@test.com</email>
  328. </contact>
  329. <contactArr>
  330. <michael.xstream.ContactBean>
  331. <postCode>200011</postCode>
  332. <telephone>021-11111111</telephone>
  333. <mobile>13911111111</mobile>
  334. <email>contact1@test.com</email>
  335. </michael.xstream.ContactBean>
  336. <michael.xstream.ContactBean>
  337. <postCode>20002</postCode>
  338. <telephone>021-22222222</telephone>
  339. <mobile>13922222222</mobile>
  340. <email>contact2@test.com</email>
  341. </michael.xstream.ContactBean>
  342. </contactArr>
  343. </UserBean>
  344. XML转化为BEAN-----------------------------
  345. userName:michael
  346. age:26
  347. birthday:Wed Jul 20 23:33:32 CST 2011
  348. addres:上海杨浦
  349. addres:江苏苏州
  350. nick name:老公<->老婆
  351. nick name:大大<->小小
  352. postcode:200000
  353. telephone:021-88888888
  354. mobile:1891800xxxx
  355. email:test@test.com
  356. BEAN转化为XML文件-----------------------------
  357. XML文件转化为BEAN-----------------------------
  358. parseFileBean->michael.xstream.UserBean@bf7190
  359. 生成的XML文件userbean.xml:
  360. <UserBean>
  361. <userName>michael</userName>
  362. <age>26</age>
  363. <birthday>2011-07-20 23:33:32.969 CST</birthday>
  364. <addresList>
  365. <string>上海杨浦</string>
  366. <string>江苏苏州</string>
  367. </addresList>
  368. <nickNameMap>
  369. <entry>
  370. <string>老公</string>
  371. <string>老婆</string>
  372. </entry>
  373. <entry>
  374. <string>大大</string>
  375. <string>小小</string>
  376. </entry>
  377. </nickNameMap>
  378. <contact>
  379. <postCode>200000</postCode>
  380. <telephone>021-88888888</telephone>
  381. <mobile>1891800xxxx</mobile>
  382. <email>test@test.com</email>
  383. </contact>
  384. <contactArr>
  385. <michael.xstream.ContactBean>
  386. <postCode>200011</postCode>
  387. <telephone>021-11111111</telephone>
  388. <mobile>13911111111</mobile>
  389. <email>contact1@test.com</email>
  390. </michael.xstream.ContactBean>
  391. <michael.xstream.ContactBean>
  392. <postCode>20002</postCode>
  393. <telephone>021-22222222</telephone>
  394. <mobile>13922222222</mobile>
  395. <email>contact2@test.com</email>
  396. </michael.xstream.ContactBean>
  397. </contactArr>
  398. </UserBean>
  399. 到此测试例子结束,是不是觉得很方便啊,吼吼





文章来源: bugstack.blog.csdn.net,作者:Yao__Shun__Yu,版权归原作者所有,如需转载,请联系作者。

原文链接:bugstack.blog.csdn.net/article/details/17397891

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。