如何在C#.Net应用程序中正确存储状态

时间:2009-10-02 13:39:43

标签: c# .net

我有一个对象列表,其中每个对象都有一个名为“enabled”的布尔属性。我想记住应用程序会话中这些对象的状态。要做到这一点,我至少有两个选项,使用注册表或使用更多的.net方法,app.config文件。我宁愿做后者。

但是,虽然静态/编译时键/值赋值很简单,但动态地将新键分配给app.config文件似乎并不重要。你有一个如何做到这一点的例子吗?

我的问题是,如果你想避免使用注册表,那么在.net中存储对象列表属性的最佳方法是什么?

6 个答案:

答案 0 :(得分:6)

如果可能或其他文件结构,我倾向于将您的状态保存到数据库。通常不会在运行时更改app.config。我倾向于将对象序列化为文件,并使用它来保持状态。

这将根据具体情况动态更改app.config或web.config。

public void ChangeAppSettings(string applicationSettingsName, string newValue)
{
    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

    KeyValueConfigurationElement element = config.AppSettings.Settings[applicationSettingsName];

    if (element != null)
    {
        element.Value = newValue;
    }
    else
    {
        config.AppSettings.Settings.Add(applicationSettingsName, newValue);
    }

    config.Save(ConfigurationSaveMode.Modified, true);

    ConfigurationManager.RefreshSection("appSettings");
}

答案 1 :(得分:2)

您还可以使用IsolatedStorage

答案 2 :(得分:2)

应用程序设置有什么问题?这是存储设置(因此名称)的最简单方法,因为您在设计器中进行设置并可以通过自动生成的类访问它,就像自动生成的资源类一样。该数据将存储在应用程序数据目录中。 WinForms应用程序中有一个默认设置文件,但您可以轻松创建其他文件。

它也不支持动态键/值对,但你可以通过使用字典解决这个问题(尽管Dictionary<TKey, TValue>没有序列化为XML,你必须解决这个问题,比如使用{{1}列表或KeyValuePair用于存储)。

答案 3 :(得分:1)

如果您不想使用应用配置或注册表,还可以查看BinaryFormatterXmlSerializer。 BinaryFormatter将依赖于版本,而XmlSerializer允许更多人工可编辑文件,以及更轻松地共享和升级其他项目。

class Program
{
    static void Main(string[] args)
    {
        var obj = new MyObject() { Prop1 = "Hello World!!!" };
        //===
        var bf = new BinaryFormatter();
        using (var fs = File.Open("myobject.bin", FileMode.Create, 
                                  FileAccess.Write, FileShare.None))
            bf.Serialize(fs, obj);
        //===
        MyObject restoredObj = null;
        using (var fs = File.OpenRead("myobject.bin"))
            restoredObj = bf.Deserialize(fs) as MyObject;

        //===
        var xSer = new XmlSerializer(obj.GetType());
        using (var fs = File.Open("myobject.xml", FileMode.Create, 
                                  FileAccess.Write, FileShare.None))
            xSer.Serialize(fs, obj);
        //===
        MyObject restoredObjXml = null;
        using (var fs = File.OpenRead("myobject.xml"))
            restoredObjXml = xSer.Deserialize(fs) as MyObject;

    }
}

[Serializable()]
[XmlRoot("myObject")]
public class MyObject
{
    [XmlAttribute("prop1")]
    public string Prop1 { get; set; }
}

答案 4 :(得分:1)

您可以使用应用程序设置(.settings文件)并将状态信息存储为键值结构(字典,自定义对象列表或其他)。 在这里,您可以找到有关在C#中使用应用设置和用户设置的更多详细信息:http://msdn.microsoft.com/en-us/library/aa730869%28VS.80%29.aspx 应用程序设置将存储在app.config中,用户设置将存储在用户的独立存储中。

答案 5 :(得分:0)

我会在退出时将对象序列化为xml文件,并在启动时反序列化。这样,当您的对象发生变化时,所有属性都会得到维护。