博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[XML] 利用XML串行化,实现应用程序配置类的存储和读取
阅读量:6160 次
发布时间:2019-06-21

本文共 3161 字,大约阅读时间需要 10 分钟。

.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到文件,写在这里作为

读者的预备知识。

转载于:https://www.cnblogs.com/allofalan/archive/2012/04/12/2443743.html

你可能感兴趣的文章
showdialog弹出窗口刷新问题
查看>>
java
查看>>
Vue.js连接后台数据jsp页面  ̄▽ ̄
查看>>
关于程序的单元测试
查看>>
mysql内存优化
查看>>
都市求生日记第一篇
查看>>
Java集合---HashMap源码剖析
查看>>
SQL优化技巧
查看>>
thead 固定,tbody 超出滚动(附带改变滚动条样式)
查看>>
Dijkstra算法
查看>>
css 动画 和 响应式布局和兼容性
查看>>
csrf 跨站请求伪造相关以及django的中间件
查看>>
MySQL数据类型--与MySQL零距离接触2-11MySQL自动编号
查看>>
生日小助手源码运行的步骤
查看>>
Configuration python CGI in XAMPP in win-7
查看>>
bzoj 5006(洛谷 4547) [THUWC2017]Bipartite 随机二分图——期望DP
查看>>
CF 888E Maximum Subsequence——折半搜索
查看>>
欧几里德算法(辗转相除法)
查看>>
面试题1-----SVM和LR的异同
查看>>
MFC控件的SubclassDlgItem
查看>>