我有一个对象列表,其中每个对象都有一个名为“enabled”的布尔属性。我想记住应用程序会话中这些对象的状态。要做到这一点,我至少有两个选项,使用注册表或使用更多的.net方法,app.config文件。我宁愿做后者。
但是,虽然静态/编译时键/值赋值很简单,但动态地将新键分配给app.config文件似乎并不重要。你有一个如何做到这一点的例子吗?
我的问题是,如果你想避免使用注册表,那么在.net中存储对象列表属性的最佳方法是什么?
答案 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)
如果您不想使用应用配置或注册表,还可以查看BinaryFormatter和XmlSerializer。 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文件,并在启动时反序列化。这样,当您的对象发生变化时,所有属性都会得到维护。