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

C# 如何在应用程序设置中存储对象列表,c#,application-settings,C#,Application Settings,我最近熟悉了C#应用程序设置,看起来很酷。 我正在寻找一种存储自定义对象列表的方法,但找不到方法 实际上,我看到了一个,但它对解决这个问题没有帮助。 我试图更改该解决方案的配置,以使其适合我的问题。其XML配置文件为: <Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User"> <Value Profile="(Default)" /> </Setting> 我想在应用程序设置中

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

<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User">
  <Value Profile="(Default)" />
</Setting>
我想在应用程序设置中存储一个列表。
那么有什么方法可以达到这个目的呢。
提前感谢。

干杯,

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

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

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


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

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

  • 二进制序列化
  • ORM映射到某个嵌入式数据库
还有许多其他的…

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

首先,将您的类更改为类似的内容(提示:):

在名为
元组的设置和
字符串的类型中添加属性

然后可以使用两种方法加载和保存元组的通用列表(
list
):

void存储元组(列表元组)
{
使用(MemoryStream ms=new MemoryStream())
{
BinaryFormatter bf=新的BinaryFormatter();
序列化(ms,元组);
ms.Position=0;
字节[]缓冲区=新字节[(int)ms.Length];
ms.Read(缓冲区,0,缓冲区长度);
Properties.Settings.Default.tuples=Convert.ToBase64String(缓冲区);
Properties.Settings.Default.Save();
}
}
列表LoadTuples()
{
使用(MemoryStream ms=new MemoryStream(Convert.FromBase64String(Properties.Settings.Default.tuples)))
{
BinaryFormatter bf=新的BinaryFormatter();
返回(列表)bf.反序列化(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();
List List=新列表();
添加(新元组());
添加(新元组());
添加(新元组());
添加(新元组());
添加(新元组());
//保存列表
存储元组(列表);
//加载列表
list=LoadTuples();

我将空字符串和异常检查留给您。

正如Tigran先生所提到的,您可以简单地使用Nuget包使用序列化转换对象(可以是列表或包含列表),并将其保存为字符串(我在设置中使用“User Scope”创建了一个字符串变量,并将其命名为“myString”):

要加载它,我们使用反序列化:

string json = Properties.Settings.Default.myString;
myObject myobject = JsonConvert.DeserializeObject<myObject>(json);
string json=Properties.Settings.Default.myString;
myObject myObject=JsonConvert.DeserializeObject(json);

谢谢您的时间和考虑。您能给我一些关于XDocument的提示吗?它是什么?您将这些值存储在单独的配置文件中是什么意思?XDocument是.NET中用于处理xml文件的类之一。如果您确实希望存储整个结构,那么XML序列化可能是更好的选择。谢谢您的回复,但是您对实现此目的有什么建议吗?要保存此对象并在以后检索它?@Ehsan根据
ConfigurationSection
定义一个具有正确属性集的自定义类。使用
ConfigurationManager
加载配置(包括用户级别)并在稍后保存。可能的重复查看这里可能会对您有所帮助…我想知道为什么这会获得否决票,知道什么是错误的会很好。我不认为
SaveTuples
方法中的sr(
StreamReader
)有任何用途,所以第二个using语句可以安全地删除。谢谢。
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();
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);