我最近熟悉了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; }
}
我想在应用程序设置中存储一个列表
那么有没有办法达到这个目的。
提前谢谢。
欢呼声,
答案 0 :(得分:32)
您可以使用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
,空字符串和异常检查留给您。
答案 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);