序列化意味着不必担心过度分离字符或解析文本返回到有意义的数据。一个简单的类来保存数据
<Serializable>
Public Class Preset
Public Property Name As String
Public Property ForeColor As Color
Public Property BackColor As Color
Public Property ThisItem As Integer
Public Property ThatItem As Integer
Public Property LastItem As String
Public Sub New()
End Sub
End Class
' elsewhere, a List of these things, so we can have many
Private Presets As New List(Of Preset)
添加一些假数据:
' file path/name:
PresetsFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"Company", "Product", "presets.xml")
Dim p As Preset
p = New Preset With {.Name = "ziggy"}
Presets.Add(p)
' quick way, no temp var
Presets.Add(New Preset With {.Name = "User Defined"})
Presets.Add(New Preset With {.Name = "Default"})
Presets.Add(New Preset With {.Name = "Custom"})
序列化整组Preset
对象到文件(保存):
Using fs As New FileStream(PresetsFileName, FileMode.OpenOrCreate)
Dim Xml As New XmlSerializer(GetType(List(Of Preset)))
Xml.Serialize(fs, Presets)
End Using
加载:
' ToDo: check if File.Exists
Using fs As New FileStream(PresetsFileName, FileMode.Open)
Dim Xml As New XmlSerializer(GetType(List(Of Preset)))
Presets = CType(Xml.Deserialize(fs), List(Of Preset))
End Using
' show none were lost:
For Each ps As Preset In Presets
Console.WriteLine(ps.Name)
Next
输出:
齐格
用户定义
默认
定制
这就是它!用少于5行代码保存或加载整个对象列表。
- 请注意,有不同种类的序列化器,这只是一个。我倾向于支持二进制序列化,因此用户无法搜索文件并将值编辑为可能导致应用程序崩溃的非法值。可以根据其串行需要
- 的
<Serializable>
属性或他人(JSON,二进制格式,protobuf网)使用。
- 一些序列化程序还需要一个简单的构造函数(不带参数的
Sub New
)。
- 可以将
Save
和Load
的方法定义为Preset
类中的Shared
方法。特别是如果有一个集合班(不只是List
)。
我想从一个文件加载应用程序的数据一下子,就用哪一个是活跃的。至于文件布局,我会使用序列化。请注意,您可能需要添加语言或技术标签以获得更具体的答案。 – Plutonix
我认为一个文件将是要走的路。我只需要解析文件来查找我正在查找的条目,这对某种分隔字符应该不会有什么坏处。 我很熟悉序列化的概念,但现在看它,我相信我正在手动。我正在将数据写入文件,然后将其读回并在需要时将其翻译回对象。有没有更好的方法来做到这一点? 感谢您的回答。 – Django