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

19

我最近熟悉了C#应用程序设置,感觉很酷。
我正在寻找一种存储自定义对象列表的方法,但是我找不到方法!
实际上,我看到了一个存储int[]的帖子,但对此问题没有帮助。
我试图更改该解决方案的配置以使其适用于我的问题。那个解决方案的XML配置文件如下:

<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User">
  <Value Profile="(Default)" />
</Setting>

我尝试在类型属性中如下引用我的对象,但这并没有帮助,因为它无法识别我的对象... 我尝试了"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; }
    }

我想将一个列表存储在应用程序设置中。
那么有没有办法实现这个目的。
提前致谢。
祝好,


可能是 http://stackoverflow.com/questions/8627887/store-a-range-of-values-in-web-config-what-data-structure-to-use/8627974#8627974 的重复问题。 - Ivo
看一下这里:https://dev59.com/knNA5IYBdhLWcg3wh-cC 这可能会对你有所帮助... - Glory Raj
5个回答

40

您可以使用BinaryFormatter将元组列表序列化为字节数组,再使用Base64(作为相当有效的方法)将字节数组存储为string

首先,将您的类更改为以下内容(提示:[SerializableAttribute]):

[Serializable()]
public class tuple
{
    public tuple()
    {
        this.font = new Font("Microsoft Sans Serif", 8);
    //....
}

在设置中添加名为tuples的属性,并将其类型设置为string

Settings中的tuples

然后您可以使用两种方法来加载和保存元组的通用列表(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、空字符串和异常检查留给你。


不知道为什么这个被踩了,知道哪里出了问题就好了。 - Michał Powaga
我认为 SaveTuples 方法中的 StreamReader (sr) 没有任何作用,因此第二个 using 语句可以安全地删除。 - Saeb Amini
谢谢您。 - Rabbid10

3
应用程序配置不是在应用程序运行时存储数据的好选择。对于这个问题,可以使用任何在.NET中可用的序列化选项,如: 还有许多其他选项。

0

我不确定你想要做的最好是在应用程序设置中完成。你可能需要研究一下XDocument,并将所需的值存储在单独的配置文件中。


感谢您的时间和考虑,能否请您给我一些关于XDocument的提示以及它是什么?您所说的将值存储在单独的配置文件中是什么意思? - Ehsan
XDocument是.NET中用于操作XML文件的类之一。如果您真的想要存储整个结构,XML序列化可能是更好的选择。http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx - tbddeveloper

0

您可以编写自定义类型来扩展.config文件。但这不会将您自己的任意类型存储在现有确认部分中,而是添加自定义部分。

通过为子节点提供完全自定义逻辑,自定义配置类型可以持有XML序列化数据。我认为这是滥用配置系统:它是用于存储设置而不是完整状态。

如果这正是您想要的,文档中ConfigurationSection有一个简单的示例。


谢谢您的回复,但您有没有关于如何实现这个目的的建议?比如如何保存这个对象并在以后检索它? - Ehsan
@Ehsan 根据 ConfigurationSection 定义一个自定义类,并设置正确的属性。使用 ConfigurationManager 加载配置(包括用户级别),稍后再保存。 - Richard

0
正如Tigran先生所提到的,您可以简单地使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接