【问题标题】:Storing settings/variables persistantly in C#/.NET在 C#/.NET 中持久存储设置/变量
【发布时间】:2011-02-27 22:52:34
【问题描述】:

好的,这是一个全新的问题,所以请原谅我。

存储变量以使其持久存在且可恢复的最佳方式是什么?我有一个小型应用程序,它使用大约 10 个变量(字符串和十进制)作为设置。目前,我将它们全部转换为字符串,如果需要,将它们放入数组并将数组序列化为文件。

如果我想添加一个变量,这会很痛苦。所以,我正在考虑使用哈希表并将其序列化。同样,不确定什么是最好的方法。

我的一些要求是数据需要安全存储(加密),并且必须可供其他应用程序访问(我还有两个读取设置的小应用程序)。

我知道我把如此基本和简单的事情过于复杂化了。这几乎必须在每个构建的应用程序中完成。

TIA

【问题讨论】:

  • 是与应用程序的每台机器配置相关联的数据,它是每用户配置的一部分,还是与可能存在无限数量的不相关实例的用户生成内容相关联每个用户?
  • 这是每台机器的配置。

标签: c# .net settings


【解决方案1】:

你为什么不把它们放在 app.config 中呢? (或 web.config)

【讨论】:

  • 抱歉,没有完整阅读要求。如果我有需要跨应用程序持久化的设置,我通常会使用数据库。
  • 我想这取决于可用的内容,任何数据库都可以。 SQLLite、SQL Server、Oracle、MySQL....哎呀,你甚至可以使用 Raven
  • 没有数据库,如果这样做,请使用 SQL Server Compact Edition (microsoft.com/Sqlserver/2005/en/us/compact.aspx),但您可以手动创建 DataTable 并序列化/反序列化 (ReadXML/WriteXML)。不要让这件事变得更难。
【解决方案2】:

使用应用程序/Web 配置文件,并使用 ConfigurationManager.AppSettings[configurationItemName] 方法。 (在 System.Configuration 中)

【讨论】:

  • 您还可以使用企业库中的配置应用程序块将设置加载/保存到 .config 文件。 (包括可以被 XML 序列化的自定义配置部分)
  • 这是一个“新手”问题。考虑到这一事实,Enterprise Library 是多余的。
【解决方案3】:

如果我仍然使用数据库,我可能会在其中添加一个表并存储它们,否则我想我会使用某种 XML 文件,我不愿意添加额外的复杂性只需几个设置的数据库。
使用这些解决方案中的任何一个,您都可以轻松添加更多设置(旧应用程序会忽略它们)以及指定数据类型(作为 XML 中的属性)。

【讨论】:

    【解决方案4】:

    您可以将值存储在系统注册表中:

    获取密钥:

    // This will create the key if it does not exist.
    String keyPath = "Sofware\Foo\Bar";  // use "Software\Company\App" or similar
    RegistryKey appKey = Registry.CurrentUser.CreateSubKey(keyPath);
    

    保存一个值:

    String config = "SomeConfigurationValue";
    appKey.SetValue("ConfigString", config);
    

    加载一个值:

    String config = (string)appKey.GetValue("ConfigString", "Default Value");
    

    【讨论】:

      【解决方案5】:

      只是为了确保我理解

      要求: 1. 将应用程序的用户特定设置存储在文件或数据库中 2. 您可以不时添加其他属性。

      这是基于网络的吗?赢得表格?,wcf?

      我最初的想法是在持久化时包含一个版本号。

      每次更新设置类时,请创建一个继承自上一个版本的新设置类。添加新属性并更新版本号。

      存储: 在数据库中,两个字段:1- 版本 2- 序列化设置数据。 在一个文件中,两个条目 1- 版本 2- 序列化设置数据。

      序列化时,确保包含设置类版本号。

      反序列化时,使用工厂检索设置类的正确版本。

      要记住的一件事是,您必须考虑应用程序中的旧设置实例。

      如果您今天添加“背景颜色”属性,则今天之前的任何设置文件都无法访问它。您需要确保应用程序能够处理这种情况。

      因此,如果工厂发现设置类的旧版本,它可以使用保存的数据来创建类的最新版本并使用默认值填充新属性。

      祝你好运,

      帕特里克

      【讨论】:

        【解决方案6】:

        最简单、有效和最灵活的方法是创建一个类,添加设置,然后在需要时进行序列化/反序列化。该类的源代码可以在其他程序集中重用,并且持久性可以在任何地方。由于您的安全要求,请确保此类知道如何对自身进行序列化/反序列化。这确保了实现与类保持一致。然后调用程序集只需要通过调用静态/共享方法来创建对象。

        这为您提供了强类型设置、版本控制、添加新设置的能力,甚至是复杂的数据类型(其他类)。这个对象甚至可以作为参数传递给其他对象,而且由于它支持序列化,所以非常灵活。

        示例

        请参阅 How-To(对象类 => 二进制序列化 => 到内存 => 加密 => 保存到文件) http://social.msdn.microsoft.com/forums/en-US/netfxremoting/thread/68c200c2-4aa4-48dc-95be-6fe077fd10f4/

        参考

        【讨论】:

        • +1 - 我以前使用过这种技术,效果很好。一个优点是,如果您使用单独的文件而不是 (app|web).config,则不需要回收应用程序。而且您不必处理键和值。
        【解决方案7】:

        将设置存储到类,并将这些对象序列化到独立存储。确保将隔离级别设置为用户级别,以便其他应用可以读取当前用户的设置。

        http://msdn.microsoft.com/en-us/library/8dzkff1s%28VS.80%29.aspx

        IsolatedStorageFile,它派生 来自IsolatedStorage,提供基本的 存储组件的管理和 申请文件。的一个实例 IsolatedStorageFile 类代表一个 位于文件中的单个商店 系统。

        【讨论】:

          【解决方案8】:

          您当然可以使用 .Net Framework 中的“应用程序设置”。

          http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

          【讨论】:

            猜你喜欢
            • 2010-09-27
            • 2012-10-30
            • 1970-01-01
            • 1970-01-01
            • 2011-08-19
            • 1970-01-01
            • 1970-01-01
            • 2014-02-16
            • 1970-01-01
            相关资源
            最近更新 更多