XStream比较小巧,用起来属于最快上手的,但是遇到几个问题:
1.
自己写的Java枚举类型没有支持,序列化和反序列化出来的都是毫无意义的枚举值。
2.
如果在序列化的内容中是含有xml的实体,xstream默认采用实体转化,而不是cdata。
3.
续问题2,如果序列化的内容中含有\n \r之类的信息,在反序列化的时候这种换行符丢失。
第三个问题已经解决,xstream本身不会存在这个问题,因为我采用了一种比较取巧的办法,只有list里面的内容我是每次append到file里面,读的时候我又把file读进来加头加尾,我readfile的部分写的不好,本身就已经把换行丢了,例如:
注意加色的那句就帮我完成了这个bug fix的工作,这下不用急着去看xstream的源代码了,至于不用CDATA嘛,也还可以接受。
至于第一个,我还不想自己写Mapper,只好辛苦一下代码,弄点bad smell进去了。:-)
1.
自己写的Java枚举类型没有支持,序列化和反序列化出来的都是毫无意义的枚举值。
2.
如果在序列化的内容中是含有xml的实体,xstream默认采用实体转化,而不是cdata。
3.
续问题2,如果序列化的内容中含有\n \r之类的信息,在反序列化的时候这种换行符丢失。
第三个问题已经解决,xstream本身不会存在这个问题,因为我采用了一种比较取巧的办法,只有list里面的内容我是每次append到file里面,读的时候我又把file读进来加头加尾,我readfile的部分写的不好,本身就已经把换行丢了,例如:
1 public class TestXStreamLoader {
2
3 //~ Instance fields ========================================================
4
5 private final String xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><list>";
6 private final String xmlFooter = "</list>";
7 private final String fileName = "/src/test/contents.txt";
8
9 //~ Methods ================================================================
10
11 public static void main(String[] args) throws IOException {
12
13 ArrayList list = new TestXStreamLoader().loadResults();
14 System.out.println(list.size());
15 }
16
17 public ArrayList loadResults() throws IOException {
18
19 XStream xstream = new XStream();
20 xstream.alias("list", ArrayList.class);
21
22 ArrayList results = (ArrayList) xstream.fromXML(this.getResultString(fileName));
23
24 return results;
25 }
26
27 private String getResultString(String fileName) throws IOException {
28
29 BufferedReader in = new BufferedReader(new FileReader(fileName));
30 StringBuffer sbuf = new StringBuffer();
31 String str = null;
32 sbuf.append(this.xmlHeader);
33
34 while ((str = in.readLine()) != null) {
35
36 sbuf.append(str);
37 sbuf.append("\n");
38 }
39
40 in.close();
41 sbuf.append(this.xmlFooter);
42
43 return sbuf.toString();
44 }
45 }
2
3 //~ Instance fields ========================================================
4
5 private final String xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><list>";
6 private final String xmlFooter = "</list>";
7 private final String fileName = "/src/test/contents.txt";
8
9 //~ Methods ================================================================
10
11 public static void main(String[] args) throws IOException {
12
13 ArrayList list = new TestXStreamLoader().loadResults();
14 System.out.println(list.size());
15 }
16
17 public ArrayList loadResults() throws IOException {
18
19 XStream xstream = new XStream();
20 xstream.alias("list", ArrayList.class);
21
22 ArrayList results = (ArrayList) xstream.fromXML(this.getResultString(fileName));
23
24 return results;
25 }
26
27 private String getResultString(String fileName) throws IOException {
28
29 BufferedReader in = new BufferedReader(new FileReader(fileName));
30 StringBuffer sbuf = new StringBuffer();
31 String str = null;
32 sbuf.append(this.xmlHeader);
33
34 while ((str = in.readLine()) != null) {
35
36 sbuf.append(str);
37 sbuf.append("\n");
38 }
39
40 in.close();
41 sbuf.append(this.xmlFooter);
42
43 return sbuf.toString();
44 }
45 }
注意加色的那句就帮我完成了这个bug fix的工作,这下不用急着去看xstream的源代码了,至于不用CDATA嘛,也还可以接受。
至于第一个,我还不想自己写Mapper,只好辛苦一下代码,弄点bad smell进去了。:-)