我們需要在XML與實體類,DataTable,List之間進行轉換,下面是XmlUtil類,該類來自網絡並稍加修改。
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
|
using
System; using
System.Collections.Generic; using
System.Linq; using
System.Text; using
System.IO; using
System.Data; using
System.Xml; using
System.Xml.Serialization; ///
<summary> ///
Xml序列化與反序列化 ///
</summary> public
class
XmlUtil { #region
反序列化 ///
<summary> ///
反序列化 ///
</summary> ///
<param name="type">類型</param> ///
<param name="xml">XML字符串</param> ///
<returns></returns> public
static
object
Deserialize(Type type, string
xml) { try { using
(StringReader sr = new
StringReader(xml)) { XmlSerializer
xmldes = new
XmlSerializer(type); return
xmldes.Deserialize(sr); } } catch
(Exception e) { return
null ; } } ///
<summary> ///
反序列化 ///
</summary> ///
<param name="type"></param> ///
<param name="xml"></param> ///
<returns></returns> public
static
object
Deserialize(Type type, Stream stream) { XmlSerializer
xmldes = new
XmlSerializer(type); return
xmldes.Deserialize(stream); } #endregion #region
序列化 ///
<summary> ///
序列化 ///
</summary> ///
<param name="type">類型</param> ///
<param name="obj">對象</param> ///
<returns></returns> public
static
string
Serializer(Type type, object
obj) { MemoryStream
Stream = new
MemoryStream(); XmlSerializer
xml = new
XmlSerializer(type); try { //序列化對象 xml.Serialize(Stream,
obj); } catch
(InvalidOperationException) { throw ; } Stream.Position
= 0; StreamReader
sr = new
StreamReader(Stream); string
str = sr.ReadToEnd(); sr.Dispose(); Stream.Dispose(); return
str; } #endregion } |
下面是測試代碼:
1. 實體對象轉換到Xml
1
2
3
4
5
6
7
8
9
|
public
class
Student { public
string
Name { set ;
get ;
} public
int
Age { set ;
get ;
} } Student
stu1 = new
Student() { Name = "okbase" ,
Age = 10 }; string
xml = XmlUtil.Serializer( typeof (Student),
stu1); Console.Write(xml); |
2. Xml轉換到實體對象
1
2
|
Student
stu2 = XmlUtil.Deserialize( typeof (Student),
xml) as
Student; Console.Write( string .Format( "名字:{0},年齡:{1}" ,
stu2.Name, stu2.Age)); |
3. DataTable轉換到Xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//
生成DataTable對象用於測試 DataTable
dt1 = new
DataTable( "mytable" );
//
必須指明DataTable名稱 dt1.Columns.Add( "Dosage" ,
typeof ( int )); dt1.Columns.Add( "Drug" ,
typeof ( string )); dt1.Columns.Add( "Patient" ,
typeof ( string )); dt1.Columns.Add( "Date" ,
typeof (DateTime)); //
添加行 dt1.Rows.Add(25,
"Indocin" ,
"David" ,
DateTime.Now); dt1.Rows.Add(50,
"Enebrel" ,
"Sam" ,
DateTime.Now); dt1.Rows.Add(10,
"Hydralazine" ,
"Christoff" ,
DateTime.Now); dt1.Rows.Add(21,
"Combivent" ,
"Janet" ,
DateTime.Now); dt1.Rows.Add(100,
"Dilantin" ,
"Melanie" ,
DateTime.Now); //
序列化 xml
= XmlUtil.Serializer( typeof (DataTable),
dt1); Console.Write(xml); |
4. Xml轉換到DataTable
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//
反序列化 DataTable
dt2 = XmlUtil.Deserialize( typeof (DataTable),
xml) as
DataTable; //
輸出測試結果 foreach
(DataRow dr in
dt2.Rows) { foreach
(DataColumn col in
dt2.Columns) { Console.Write(dr[col].ToString()
+ "
" ); } Console.Write( "\r\n" ); } |
5. List轉換到Xml
1
2
3
4
5
6
7
8
|
//
生成List對象用於測試 List<Student>
list1 = new
List<Student>(3); list1.Add( new
Student() { Name = "okbase" ,
Age = 10 }); list1.Add( new
Student() { Name = "csdn" ,
Age = 15 }); //
序列化 xml
= XmlUtil.Serializer( typeof (List<Student>),
list1); Console.Write(xml); |
6. Xml轉換到List
1
2
3
4
5
|
List<Student>
list2 = XmlUtil.Deserialize( typeof (List<Student>),
xml) as
List<Student>; foreach
(Student stu in
list2) { Console.WriteLine(stu.Name
+ ","
+ stu.Age.ToString()); } |
從代碼可以看到,千變萬化不離其宗!
public class XmlSerialize<T>
{
/// <summary
/// 對象序列化成 XML String
/// </summary
public static string XmlSerialize<T>(T obj)
{
string xmlString = string.Empty;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
xmlSerializer.Serialize(ms, obj);
xmlString = Encoding.UTF8.GetString(ms.ToArray());
}
return xmlString;
}
/// <summary
/// XML String 反序列化成對象
/// </summary
public static T XmlDeserialize<T>(string xmlString)
{
T t = default(T);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (Stream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString)))
{
using (XmlReader xmlReader = XmlReader.Create(xmlStream))
{
Object obj = xmlSerializer.Deserialize(xmlReader);
t = (T)obj;
}
} return t;
}
//如果要序列化到一個文件,則使用FileStream就可以瞭如:
// string strFile = @c:/book.xml;
//using (FileStream fs = new FileStream(strFile, FileMode.Create)){
//XmlSerializer formatter = new XmlSerializer(typeof(T));
//formatter.Serialize(fs, entity);}附:其實還可以直接用SringWriter
//StringBuilder sb = new StringBuilder();
//System.IO.StringWriter writer = new System.IO.StringWriter(sb)
}