2015-07-10 129 views
1

如果一个程序需要多个相同类型的文件,比如说10个设置预设,那么将这些信息存储在文件中的典型方法是什么?将多个应用程序数据项保存到一个或多个文件?

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

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

这些方法有差异吗?一个比另一个更好吗?

+0

我想从一个文件加载应用程序的数据一下子,就用哪一个是活跃的。至于文件布局,我会使用序列化。请注意,您可能需要添加语言或技术标签以获得更具体的答案。 – Plutonix

+0

我认为一个文件将是要走的路。我只需要解析文件来查找我正在查找的条目,这对某种分隔字符应该不会有什么坏处。 我很熟悉序列化的概念,但现在看它,我相信我正在手动。我正在将数据写入文件,然后将其读回并在需要时将其翻译回对象。有没有更好的方法来做到这一点? 感谢您的回答。 – Django

回答

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. <Serializable>属性或他人(JSON,二进制格式,protobuf网)使用。
  3. 一些序列化程序还需要一个简单的构造函数(不带参数的Sub New)。
  4. 可以将SaveLoad的方法定义为Preset类中的Shared方法。特别是如果有一个集合班(不只是List)。
+0

哇,很好的解释。不胜感激。谢谢! – Django

+0

嘿,如果你不介意,我还有一个关于序列化对象的问题(作为字段)。如果你有时间,一个答案将不胜感激。 http://stackoverflow.com/questions/31388702/xml-serializing-objects-that-c​​ontain-other-objects-recursive-serialization – Django

相关问题