2011-12-31 77 views
15

我最近熟悉了C#应用程序设置,看起来很酷。
我正在寻找一种方法来存储自定义对象的列表,但我找不到方法!
其实我看到一个post to store int[],但这对这个问题没有帮助。
我试图改变该解决方案的配置,以使其适合我的问题。的是,XML配置文件是:如何在应用程序设置中存储对象列表

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

我试图解决我的对象作为类型属性低于报价,但由于它不承认我的对象是没有什么帮助......我想“类型=列表“和‘TYPE =’元组[]”
这两个选项没有帮助我

我有一个类的样子:

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; } 
    } 

,我想存储在应用程序列表设置。
所以有什么办法可以达到这个目的。
在此先感谢。
干杯,

+0

可能的重复http://stackoverflow.com/questions/8627887/store-a-range-of-values-in-web-config-what-data-structure-to-use/8627974#8627974 – ivowiblo 2011-12-31 15:03:10

+0

需要一个看看这里http://stackoverflow.com/questions/922047/store-dictionarystring-string-in-application-settings它可能会帮助你... – 2011-12-31 15:06:53

回答

29

您可以使用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,丝竹空例外检查你。

+0

我不知道为什么这会得到downvote,这将是很高兴知道什么是错的。 – 2012-01-01 02:32:22

+0

我不认为'SaveTuples'方法中的** sr **('StreamReader')可用于任何目的,因此可以安全地删除第二条using语句。 – 2014-10-11 12:15:17

+0

@SaebAmini,你是对的。更正:-)。 – 2014-10-11 17:39:22

0

我不确定你想要做什么最好在应用程序设置中完成。您可能想要查看的是XDocument,并将您需要的值存储在单独的配置文件中。

+0

感谢您的时间和考虑,你可以请给我一些关于XDocument的提示它是什么?通过将值存储在单独的配置文件中是什么意思? – Ehsan 2011-12-31 14:54:10

+0

XDocument是在.NET中处理xml文件的类之一。 http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx如果你真的想要存储整个结构,XML序列化可能是你最好的选择。 – Hammerstein 2011-12-31 15:35:33

0

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

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

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

+0

感谢您的回应,但您有什么建议可以达到这个目的吗?保存这个对象并在以后检索它? – Ehsan 2011-12-31 15:00:30

+0

@Ehsan使用正确的一组属性定义一个基于'ConfigurationSection'的自定义类。使用'ConfigurationManager'来加载配置(包括用户级别),然后保存。 – Richard 2012-01-01 08:01:38

相关问题