【问题标题】:Most efficent way to save custom settings保存自定义设置的最有效方式
【发布时间】:2017-09-02 18:23:50
【问题描述】:

我的 VS2013 VB 应用程序当前将设置保存到注册表,它已经发展到让我感到困扰的地步。所以我想将设置(字符串)保存到文件中。一个好处是它们可以在网络上并被多个用户使用。可能有数百甚至数千行。首选的格式是什么?旧的 INI、CSV、XML?据我所知,在这种情况下,设置文件似乎不是一个好的选择。

【问题讨论】:

  • 在这种情况下,设置文件似乎不是一个好的选择为什么?
  • 不知道要保存的全部内容是什么,它们在本地系统上,而不是在网络上。
  • 我不知道第一部分是什么意思。没有明确描述要解决的问题,但是... a) INI 文件至少从 2003 年开始就已经过时了。 b) 长期以来,使用 system 注册表进行 user 设置一直是个坏主意。 c) 现在可以将设置设置为本地或漫游很长时间 d) 您还可以使用自定义设置提供程序,这样您仍然可以使用 IDE UI,但可以随心所欲地使用它们。作为最后的手段,您接受的答案之类的东西
  • Plutonix,感谢您的帮助。我同意 INI 文件和注册表,我只是列出选项,即使是糟糕的选项。我将查看漫游设置。请原谅我的无知,但是如果我不知道如何保存设置(取决于他们选择从我的默认值更改多少),我可以在运行时创建设置吗?

标签: vb.net settings


【解决方案1】:

我强烈建议为 .NET 应用程序创建一个类的对象并使用 XML 序列化。它易于实施,完全受支持,您可以将设置从一台计算机导入和导出到另一台计算机。您甚至可以将您的应用程序设置为准备好来自网络的设置。此外,它将使未来的编程/升级更容易。

我在这里列出了一个工作示例(已测试)。该代码自 2012 年以来一直在使用,并且非常适合企业级应用程序。

注意:我只包含了一个“设置项”用于演示,因此您可以添加自己的。

第一:设置或选项类:

Imports System.Xml.Serialization
Imports System.IO

<Serializable()> _
Public Class Options

    Public KEYS_USE_LISTS As Boolean

    Public Sub New() 
        KEYS_USE_LISTS = True 
    End Sub

#Region "Methods"

    Public Sub Save(ByVal Path As String)
        Try
            Dim _XMLSerilizer As New XmlSerializer(GetType(Options))
            Dim _StreamWriter As New StreamWriter(Path)
            _XMLSerilizer.Serialize(_StreamWriter, Me)
            _StreamWriter.Close()
        Catch ex As Exception
            MsgBox("Error saving database setting." & vbCrLf & "Internal Error: " & ex.Message)
        End Try
    End Sub

    Public Function DoLoad(ByVal Path As String) As Options
        Dim _Opt As New Options
        Try
            If IO.File.Exists(Path) Then
                Dim _XMLSerilizer As New XmlSerializer(GetType(Options))
                Dim _FileStream As New FileStream(Path, FileMode.Open)

                _Opt = DirectCast(_XMLSerilizer.Deserialize(_FileStream), Options)
                _FileStream.Close()
            End If
        Catch ex As Exception
            MsgBox("Error loading database setting." & vbCrLf & "Internal Error: " & ex.Message)
        End Try
        Return _Opt
    End Function

#End Region


End Class

第二种:通过界面使用(比如WinForms)

Public Class frmOptions



    Public _options As New Options

    Private Sub frmOptions_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        If IO.File.Exists(Application.StartupPath & "/_Options.opt") Then
            _options = _options.DoLoad(Application.StartupPath & "/_Options.opt")
        End If

        chkUseList.Checked = _options.KEYS_USE_LISTS 

    End Sub

    Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click

        If IO.File.Exists(Application.StartupPath & "/_Options.opt") Then
            _options = _options.DoLoad(Application.StartupPath & "/_Options.opt")
        End If

        _options.KEYS_USE_LISTS = chkUseList.Checked 
        _options.Save(Application.StartupPath & "/_Options.opt")

        Me.DialogResult = Windows.Forms.DialogResult.OK
        Me.Close()

    End Sub



End Class

【讨论】:

  • 为什么要在变量名前加上下划线?这违反了 VB.NET 的命名约定(尤其是 Public 的!)。另外,不要将Dim _StreamWriter ...Dim _FileStream ... 放在Using blocks 中。
  • 有效的评论,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2015-10-15
  • 2022-08-10
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多