上一篇文章我們介紹了java實(shí)現(xiàn)的各種排序算法代碼示例,本文我們看看Java對(duì)象的xml序列化與反序列化的相關(guān)內(nèi)容,具體如下。
XML是一種標(biāo)準(zhǔn)的數(shù)據(jù)交換規(guī)范,可以方便地用于在應(yīng)用之間交換各類數(shù)據(jù)。如果能在Java對(duì)象和XML文檔之間建立某種映射,例如Java對(duì)象的XML序列化和反序列化,那么就可以使Java的對(duì)象方便地與其他應(yīng)用進(jìn)行交換。
java.beans包里面有兩個(gè)類XMLEncoder和Decoder,分別用于將符合JabaBeans規(guī)范的Java對(duì)象以XML方式序列化和反序列化。以下代碼顯示了如何使用這兩個(gè)類實(shí)現(xiàn)Java對(duì)象的XML編碼和解碼。
待序列化的Java類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import java.io.Serializable; public class SerialableObject implements Serializable { private static final long serialVersionUID = 8745578444312339136L; public SerialableObject() { } public SerialableObject( int id, String name, double value) { this .id = id; this .name = name; this .value = value; } public int getId() { return id; } public void setId( int id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } public double getValue() { return value; } public void setValue( double value) { this .value = value; } private int id; private String name; private double value; } |
XML序列化和反序列化用法演示類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import java.util.Vector; public class XmlSerialize { public XmlSerialize() { } public void serializeSingleObject(OutputStream os, Object obj) // 序列化單個(gè)java對(duì)象 { // XMLEncoder xe = new XMLEncoder(os); XMLEncoder xe = new XMLEncoder(os, "GBK" , true , 0 ); // 僅用于Java SE 7 xe.writeObject(obj); // 序列化成XML字符串 xe.close(); } public Object deserializeSingleObject(InputStream is) // 反序列化單個(gè)Java對(duì)象 { XMLDecoder xd = new XMLDecoder(is); Object obj = xd.readObject(); // 從XML序列中解碼為Java對(duì)象 xd.close(); return obj; } public void serializeMultipleObject(OutputStream os, List<Object> objs) // 序列化多個(gè)Java對(duì)象 { XMLEncoder xe = new XMLEncoder(os); xe.writeObject(objs); // 序列化成XML字符串 xe.close(); } public List<Object> deserializeMultipleObject(InputStream is) // 反序列化多個(gè)Java對(duì)象 { XMLDecoder xd = new XMLDecoder(is); @SuppressWarnings ( "unchecked" ) List<Object> objs = (List<Object>)xd.readObject(); // 從XML序列中解碼為Java對(duì)象列表 xd.close(); return objs; } public void runSingleObject() { File xmlFile = new File( "object.xml" ); SerialableObject jo4Out = new SerialableObject( 1 , "Java序列化為XML" , 3.14159265359 ); // 創(chuàng)建待序列化的對(duì)象 try { FileOutputStream ofs = new FileOutputStream(xmlFile); // 創(chuàng)建文件輸出流對(duì)象 serializeSingleObject(ofs, jo4Out); ofs.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { FileInputStream ifs = new FileInputStream(xmlFile); SerialableObject jo4In = (SerialableObject)deserializeSingleObject(ifs); System.out.println( "id: " + jo4In.getId()); System.out.println( "name: " + jo4In.getName()); System.out.println( "value: " + jo4In.getValue()); } catch (FileNotFoundException e) { e.printStackTrace(); } } public void runMultipleObject() { File xmlFile = new File( "objects.xml" ); List<SerialableObject> sos4Out = new Vector<SerialableObject>(); sos4Out.add( new SerialableObject( 1 , "Java序列化為XML - 1" , 3.14 )); // 創(chuàng)建待序列化的對(duì)象 sos4Out.add( new SerialableObject( 2 , "Java序列化為XML - 2" , 3.14159 )); // 創(chuàng)建待序列化的對(duì)象 sos4Out.add( new SerialableObject( 3 , "Java序列化為XML - 3" , 3.1415926 )); // 創(chuàng)建待序列化的對(duì)象 sos4Out.add( new SerialableObject( 4 , "Java序列化為XML - 4" , 3.141592653 )); // 創(chuàng)建待序列化的對(duì)象 sos4Out.add( new SerialableObject( 5 , "Java序列化為XML - 5" , 3.14159265359 )); // 創(chuàng)建待序列化的對(duì)象 try { FileOutputStream ofs = new FileOutputStream(xmlFile); // 創(chuàng)建文件輸出流對(duì)象 serializeSingleObject(ofs, sos4Out); ofs.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { FileInputStream ifs = new FileInputStream(xmlFile); @SuppressWarnings ( "unchecked" ) List<SerialableObject> sos4In = (List<SerialableObject>)deserializeSingleObject(ifs); for (SerialableObject jo4In : sos4In) { System.out.println( "id: " + jo4In.getId()); System.out.println( "name: " + jo4In.getName()); System.out.println( "value: " + jo4In.getValue()); } } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { XmlSerialize xs = new XmlSerialize(); xs.runSingleObject(); xs.runMultipleObject(); } } |
需要注意的是,待序列化的類必須要符合JavaBeans的格式規(guī)范,即:具有一個(gè)無參的public構(gòu)造函數(shù),所有數(shù)據(jù)成員的訪問均采用getter/setter模式,此外,這個(gè)類必須是public的,并且實(shí)現(xiàn)了java.io.Serializable接口。
程序運(yùn)行之后,會(huì)產(chǎn)生兩個(gè)文件:
object.xml是runSingleObject方法生成的,存放了單個(gè)的SerialableObject的值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<? xml version = "1.0" encoding = "GBK" ?> < java version = "1.7.0" class = "java.beans.XMLDecoder" > < object class = "SerialableObject" > < void property = "id" > < int >1</ int > </ void > < void property = "name" > < string >Java序列化為XML</ string > </ void > < void property = "value" > < double >3.14159265359</ double > </ void > </ object > </ java > |
objects.xml是runMultipleObject方法產(chǎn)生的,存放了5個(gè)SerializableObject的值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
<? xml version = "1.0" encoding = "GBK" ?> < java version = "1.7.0" class = "java.beans.XMLDecoder" > < object class = "java.util.Vector" > < void method = "add" > < object class = "SerialableObject" > < void property = "id" > < int >1</ int > </ void > < void property = "name" > < string >Java序列化為XML - 1</ string > </ void > < void property = "value" > < double >3.14</ double > </ void > </ object > </ void > < void method = "add" > < object class = "SerialableObject" > < void property = "id" > < int >2</ int > </ void > < void property = "name" > < string >Java序列化為XML - 2</ string > </ void > < void property = "value" > < double >3.14159</ double > </ void > </ object > </ void > < void method = "add" > < object class = "SerialableObject" > < void property = "id" > < int >3</ int > </ void > < void property = "name" > < string >Java序列化為XML - 3</ string > </ void > < void property = "value" > < double >3.1415926</ double > </ void > </ object > </ void > < void method = "add" > < object class = "SerialableObject" > < void property = "id" > < int >4</ int > </ void > < void property = "name" > < string >Java序列化為XML - 4</ string > </ void > < void property = "value" > < double >3.141592653</ double > </ void > </ object > </ void > < void method = "add" > < object class = "SerialableObject" > < void property = "id" > < int >5</ int > </ void > < void property = "name" > < string >Java序列化為XML - 5</ string > </ void > < void property = "value" > < double >3.14159265359</ double > </ void > </ object > </ void > </ object > </ java > |
總結(jié)
以上就是本文關(guān)于Java對(duì)象的XML序列化與反序列化實(shí)例解析的全部內(nèi)容,希望對(duì)大家有所幫助。什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。
原文鏈接:http://blog.csdn.net/kingfox/article/details/8087103