.Net 提供了极其方便的Xml串行化和反串行化机制,封装在
System.Xml.Serialization.XmlSerializer 中
当对类做Xml串行化时,将对类中的Public属性或者成员进行串行化操作。
对于一个应用程序的配置类来说,在早期的应用程序中,多采用INI文件
但对于现在而言,INI文件已经显得有些笨拙了,读取和写入并不轻松。
有人会说Xml的读取和写入也很复杂,这我同意,但是,应用Xml串行化,
将让你的操作,变得如此简单,如果你亲手试一试的话。
我们知道,XmlSerializer在串行化时,需要用户提供 需要串行化类中所有
包含的类型(Type),所以,我所写的Xml串行化扩展 程序集,包含了一个
接口(Interface)
1 Public Interface IXmlSerializationAble
2 Function GetIncludeTypes() As Type()
3 End Interface
这个接口,强调继承它的类,要提供包含的类型,直接的或者间接的。
继承了该接口即可通过我所写的XmlSerializationEx,快速的进行读写,
岂不是,做配置文件读写最方便的方法么?当然,你也可以用于简单的
数据存储。或者数据传递。
1 Public NotInheritable Class XmlSerializationEx
2
3 Public Shared Function Read(ByRef instance As IXmlSerializationAble, ByVal fileName As String) As Boolean
4 Dim fi As New IO.FileInfo(fileName)
5 If Not fi.Exists Then
6 Return False
7 End If
8 Dim fs As IO.FileStream = fi.OpenRead
9 Dim reader As New System.Xml.Serialization.XmlSerializer(instance.GetType, instance.GetIncludeTypes)
10
11 Try
12 instance = reader.Deserialize(fs)
13 Catch ex As Exception
14 Return False
15 Finally
16 If Not fs Is Nothing Then fs.Close()
17 reader = Nothing
18 End Try
19 Return True
20 End Function
21
22 Public Shared Function ReadFromString(ByRef instance As IXmlSerializationAble, ByVal content As String) As Boolean
23 If content.Length = 0 Then
24 Return False
25 End If
26 Dim byteBuf() As Byte = System.Text.Encoding.Default.GetBytes(content)
27 Dim ms As New IO.MemoryStream(byteBuf)
28
29 Dim reader As New System.Xml.Serialization.XmlSerializer(instance.GetType, instance.GetIncludeTypes)
30 Try
31 instance = reader.Deserialize(ms)
32 Catch ex As Exception
33 Return False
34 Finally
35 ms.Close()
36 ms = Nothing
37 reader = Nothing
38 End Try
39 Return True
40 End Function
41
42 Public Shared Function Write(ByRef instance As IXmlSerializationAble, ByVal filename As String) As Boolean
43 Dim fi As IO.FileInfo
44 fi = New IO.FileInfo(filename)
45 Dim stream As IO.Stream = fi.Open(IO.FileMode.Create)
46 Dim writer As New System.Xml.Serialization.XmlSerializer(instance.GetType, instance.GetIncludeTypes)
47 Dim ns As New System.Xml.Serialization.XmlSerializerNamespaces
48 ns.Add("", "")
49 Try
50 '' 涓茶鍖栧璞?寮哄埗鍛藉悕绌洪棿涓虹┖
51 writer.Serialize(stream, instance, ns)
52 Catch ex As Exception
53 Return False
54 Finally
55 stream.Close()
56 stream = Nothing
57 writer = Nothing
58 End Try
59 Return True
60 End Function
在XmlSerializationEx中,提供了Read、ReadFromString和Write几个静态方法。
让Xml配置文件读写变得轻松无比。
这里还提供了一个简单的方法,用于收集各种类型。
1 Public Shared Function GetArray(ByVal ParamArray types() As System.Type) As System.Type()
2 Return types
3 End Function
这是一个适合懒人使用的快速建立数组的方法,通过它,你无须Dim typeArr() as Type
下面写一个可以被用于串行化的类,作为例子。
1 Public Class XmlSerializationAbleSample
2 Implements IXmlSerializationAble
3
4 Public Field As ArrayList
5
6 Public Function GetIncludeTypes() As System.Type() Implements IXmlSerializationAble.GetIncludeTypes
7 Return GetArray(Field.GetType, GetType(Node))
8 End Function
9 End Class
这里的Field.Gettype 将返回Arraylist类型的类型,GetType(Node)则返回包含在Field中的
并未显示的类的类型。
Ok,就到这里,我的AMindMap中也将使用这个方法来保存MindMap到文件,写在这里作为
读者的预备知识。