将多个App Data项保存到一个或多个文件中



如果一个程序需要多个相同类型的文件,比如10个预设设置,那么在文件中存储这些信息的典型方法是什么?

到目前为止,我已经为每个预设创建了一个新文件,所以我有Preset1.set, Preset2.set, Preset3.set,等等。为了访问它们,我将遍历目录中的所有文件,并读取扩展名为.set的文件。

我现在意识到它可能是更有效和传统的存储在一个名为Preset.set的文件中所有的预设配置,然后用一些分隔字符写入所有预设配置到同一个文件,说~~~

这些方法有区别吗?一个比另一个好吗?

序列化意味着永远不必担心分隔字符或将文本解析回有意义的数据。保存数据

的简单类
<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行代码中保存或加载整个对象列表。

    请注意,有不同类型的序列化器,这只是其中之一。我倾向于二进制序列化,这样用户就不能追踪文件并将值编辑为可能导致应用程序崩溃的非法值。
  1. 可能需要<Serializable>属性或其他属性,这取决于您使用的序列化器(json,二进制格式化器,Protobuf-net)。
  2. 一些序列化器也需要一个简单的构造函数(没有参数的Sub New)。
  3. SaveLoad的方法可以定义为Preset类中的Shared方法。特别是如果有一个集合类(不只是一个List)。

相关内容

最新更新