如何在应用程序设置中存储对象列表
Posted
技术标签:
【中文标题】如何在应用程序设置中存储对象列表【英文标题】:How to store a list of objects in application settings 【发布时间】:2012-01-31 02:28:20 【问题描述】:我最近熟悉了 C# 应用程序设置,感觉很酷。 我正在寻找一种方法来存储自定义对象列表,但我找不到方法! 其实我看到了post to store int[],但对这个问题没有帮助。 我试图更改该解决方案的配置,以使其适合我的问题。那个 XML 配置文件是:
<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User">
<Value Profile="(Default)" />
</Setting>
我尝试按照下面 type 属性中引用的方式来处理我的对象,但它没有帮助,因为它无法识别我的对象...我尝试了“type = List”和“type="tuple[]" 这两个选项都没有帮助我!
我有一个类看起来像:
class tuple
public tuple()
this.font = new Font ("Microsoft Sans Serif",8);
this.backgroundcolor_color = Color.White;
this.foregroundcolor_color = Color.Black;
public string log get; set;
public Font font get ; set;
public String fontName get; set;
public string foregroundcolor get; set;
public Color foregroundcolor_color get; set;
public string backgroundcolor get; set;
public Color backgroundcolor_color get; set;
public Boolean notification get; set;
我想在应用程序设置中存储一个列表。 那么有什么办法可以达到这个目的。 提前致谢。 干杯,
【问题讨论】:
***.com/questions/8627887/…的可能重复 看看这里***.com/questions/922047/…它可能对你有帮助...... 【参考方案1】:我不确定您想要做什么最好在应用程序设置中完成。您可能想要查看的是 XDocument,并将您需要的值存储在单独的配置文件中。
【讨论】:
感谢您的时间和考虑,能否请您给我一些关于 XDocument 及其是什么的提示?将值存储在单独的配置文件中是什么意思? XDocument 是用于在 .NET 中操作 xml 文件的类之一。 msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx 如果你真的想存储整个结构,XML 序列化可能是你更好的选择。【参考方案2】:您可以编写自定义类型来扩展.config
文件。但这不会将您自己的任意类型存储在现有的确认部分中,而是添加自定义部分。
通过为子节点提供完全自定义的逻辑,自定义配置类型可以保存 XML 序列化数据。我认为这是在滥用配置系统:它是为了存储设置而不是完成状态。
如果这是您想要的,ConfigurationSection
的文档中有一个简单示例。
【讨论】:
感谢您的回复,但您对实现此目的有什么建议吗?保存此对象并稍后检索它? @Ehsan 基于ConfigurationSection
使用正确的属性集定义自定义类。使用ConfigurationManager
加载配置(包括用户级别),然后保存。【参考方案3】:
应用程序配置不是在应用程序运行时存储数据的好选择。
为此,请使用 .NET
序列化选项中可用的任何选项,例如
还有很多其他...
【讨论】:
【参考方案4】:您可以使用BinaryFormatter 将元组列表序列化为字节数组,并使用Base64(作为一种非常有效的方式)将字节数组存储为string
。
首先将您的课程更改为类似的内容(提示:[SerializableAttribute]
):
[Serializable()]
public class tuple
public tuple()
this.font = new Font("Microsoft Sans Serif", 8);
//....
在名为tuples
和string
类型的设置中添加属性。
然后您可以使用两种方法来加载和保存元组的通用列表(List<tuple>
):
void SaveTuples(List<tuple> tuples)
using (MemoryStream ms = new MemoryStream())
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, tuples);
ms.Position = 0;
byte[] buffer = new byte[(int)ms.Length];
ms.Read(buffer, 0, buffer.Length);
Properties.Settings.Default.tuples = Convert.ToBase64String(buffer);
Properties.Settings.Default.Save();
List<tuple> LoadTuples()
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(Properties.Settings.Default.tuples)))
BinaryFormatter bf = new BinaryFormatter();
return (List<tuple>)bf.Deserialize(ms);
例子:
List<tuple> list = new List<tuple>();
list.Add(new tuple());
list.Add(new tuple());
list.Add(new tuple());
list.Add(new tuple());
list.Add(new tuple());
// save list
SaveTuples(list);
// load list
list = LoadTuples();
我把null
、空字符串和异常检查留给你。
【讨论】:
我想知道为什么这会被否决,很高兴知道出了什么问题。 我认为SaveTuples
方法中的sr (StreamReader
) 没有任何用途,因此可以安全地删除第二个 using 语句。
谢谢你。【参考方案5】:
正如蒂格兰先生所说,您可以简单地使用Newtonsoft.Json Nuget 包通过序列化转换您的对象(可以是列表或包含列表)并将其保存为字符串(我在设置中使用“用户范围”并将其命名为“myString”):
string json = JsonConvert.SerializeObject(myObject);
Properties.Settings.Default.myString = json;
Properties.Settings.Default.Save();
要加载它,我们使用反序列化:
string json = Properties.Settings.Default.myString;
myObject myobject = JsonConvert.DeserializeObject<myObject>(json);
【讨论】:
以上是关于如何在应用程序设置中存储对象列表的主要内容,如果未能解决你的问题,请参考以下文章
只有 NSDictionary 中的属性列表对象(NSNumber),但不能在 UserDefaults 中存储 dict
如何在Timer事件处理程序中获取Timer对象列表的列表索引