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

时间:2011-12-31 14:46:07

标签: c# application-settings

我最近熟悉了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; }
    }

我想在应用程序设置中存储一个列表 那么有没有办法达到这个目的。
提前谢谢。
欢呼声,

5 个答案:

答案 0 :(得分:32)

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

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

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

在名为tuples的设置和string的类型中添加属性。

tuples in Settings

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

答案 1 :(得分:2)

应用程序配置不是在应用程序运行时存储数据的好选择。 为此,请使用.NET序列化选项中的任何可用选项,例如

和其他许多人......

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

如果这是你想要的,ConfigurationSection的文档中有一个简单的例子。

答案 4 :(得分:0)

如提格伦先生所说,您可以简单地使用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);