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

时间:2015-07-10 14:19:40

标签: .net vb.net file

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

到目前为止,我一直在为每个预设创建一个新文件,所以我有Preset1.set, Preset2.set, Preset3.set等。要访问它们,我将遍历目录中的所有文件并阅读{{1}的文件。 } extension。

我现在意识到,将所有预设存储在名为.set的文件中,然后将所有预设配置写入具有一些分隔字符的同一文件,可能更有效率和传统,例如{{1 }}

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

1 个答案:

答案 0 :(得分:1)

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

<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. 请注意,有不同种类的序列化程序,这只是一个。我倾向于支持二进制序列化,因此用户无法搜索文件并将值编辑为非法值,这可能会导致应用程序崩溃。
  2. 根据您使用的序列化程序(json,二进制格式化程序,Protobuf-net),可能需要<Serializable>属性或其他属性。
  3. 某些序列化程序还需要一个简单的构造函数(Sub New,不带参数)。
  4. SaveLoad的方法可以在Shared类中定义为Preset方法。特别是如果有一个集合类(不只是List)。