2015-07-10 69 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

相關問題