.net 是否将多个应用程序数据项保存到一个或多个文件?

.net 是否将多个应用程序数据项保存到一个或多个文件?,.net,vb.net,file,.net,Vb.net,File,如果一个程序需要多个相同类型的文件,比如10个设置预设,那么在文件中存储这些信息的典型方式是什么 到目前为止,我一直在为每个预设创建一个新文件,因此我有Preset1.set、Preset2.set、Preset3.set等。要访问它们,我将遍历目录中的所有文件,并读取扩展名为.set的文件 我现在意识到,将所有预设存储在一个名为Preset.set的文件中,然后使用一些分隔字符将所有预设配置写入同一个文件,例如~~,可能会更有效、更传统 这些方法有区别吗?一个比另一个好吗?序列化意味着永远不必

如果一个程序需要多个相同类型的文件,比如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)
将整套
预设
对象序列化到文件(保存):

装载:

' 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行代码中保存或加载整个对象列表

  • 请注意,有不同类型的序列化程序,这只是其中之一。我倾向于使用二进制序列化,这样用户就无法查找文件并将值编辑为非法值,这可能会导致应用程序崩溃
  • 根据您使用的序列化程序(json、二进制格式化程序、Protobuf net),可能需要
    属性或其他属性
  • 一些序列化程序还需要一个简单的构造函数(
    subnew
    ,不带参数)
  • 保存
    加载
    的方法可以定义为
    预设
    类中的
    共享
    方法。如果有一个集合类(而不仅仅是
    列表
    ),情况尤其如此

  • 我会一次从一个文件加载应用程序数据,然后只使用激活的那个文件。至于文件布局,我会使用序列化。请注意,您可能希望添加一个语言或技术标签,以便能够获得更具体的答案。我认为一个文件是最好的选择。我只需要为我正在寻找的条目实现对文件的解析,使用某种分隔字符应该一点也不坏。我对序列化的概念很熟悉,但现在来看,我相信我是在手动操作。我将数据写入一个文件,然后将其读回,并在需要时将其转换回对象。有更好的方法吗?谢谢你的回答。哇,很好的解释。非常感谢。谢谢嘿,如果你不介意的话,我还有另一个问题,关于用对象(作为字段)序列化对象。如果您有时间,我们将不胜感激。
    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