如何在应用程序设置中存储对象列表

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 序列化选项中可用的任何选项,例如

Xml Serialization 二进制序列化proto-buf Json serialization ORM 映射到一些嵌入数据库Sqlite

还有很多其他...

【讨论】:

【参考方案4】:

您可以使用BinaryFormatter 将元组列表序列化为字节数组,并使用Base64(作为一种非常有效的方式)将字节数组存储为string

首先将您的课程更改为类似的内容(提示:[SerializableAttribute]):

[Serializable()]
public class tuple

    public tuple()
    
        this.font = new Font("Microsoft Sans Serif", 8);
    //....

在名为tuplesstring 类型的设置中添加属性。

然后您可以使用两种方法来加载和保存元组的通用列表(List&lt;tuple&gt;):

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

如何针对分层对象列表动态构建和存储复杂的 linq 查询?

如何在Timer事件处理程序中获取Timer对象列表的列表索引

如何存储 Switch 语句中的案例列表?

iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

如何将对象列表存储在数组中?