我正在尝试使用ApplicationSettingsBase来保存我的类。我在这里有一个例子。我也试过没有使用ApplicationSettingsBase,这似乎工作正常。这个例子在下面进一步说明。
有人可以给我一些关于使用ApplicationSettingsBase来保持我的完整类层次结构的指导吗?谢谢,谢谢。
我在第一个例子中保存了一些中间实例,试图解决这个问题。我不打算在最终实施中这样做。我在这里可以看到它将保存中间数据但不保存嵌套数据。我只是不明白。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;
// prefs is defined in Settings.settings with the name prefs, type WindowsFormsApplication1.Prefs, user scope, and no default value.
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Properties.Settings.Default.prefs = new Prefs();
Test test = new Test();
test.steps.Add("Step1");
test.steps.Add("Step2");
Properties.Settings.Default.prefs.tests.Add(test);
test.Save();
Properties.Settings.Default.Save();
Properties.Settings.Default.prefs.Save();
Environment.Exit(0);
}
}
// WindowsFormsApplication1.Prefs
public class Prefs : ApplicationSettingsBase
{
[UserScopedSetting]
[SettingsSerializeAs(SettingsSerializeAs.Xml)]
public List<Test> tests
{
get { return ((List<Test>)(this["tests"])); }
set { this["tests"] = value; }
}
public Prefs()
{
tests = new List<Test>();
}
}
public class Test : ApplicationSettingsBase
{
[UserScopedSetting]
[SettingsSerializeAs(SettingsSerializeAs.Xml)]
public string name
{
get { return ((string)(this["name"])); }
set { this["name"] = value; }
}
[UserScopedSetting]
[SettingsSerializeAs(SettingsSerializeAs.Xml)]
public List<string> steps
{
get { return ((List<string>)(this["steps"])); }
set { this["steps"] = value; }
}
public Test()
{
name = "NoName";
steps = new List<string>();
}
}
}
运行后user.config:
/*
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="WindowsFormsApplication1.Prefs" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="WindowsFormsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="WindowsFormsApplication1.Test" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<WindowsFormsApplication1.Prefs>
<setting name="tests" serializeAs="Xml">
<value />
</setting>
</WindowsFormsApplication1.Prefs>
<WindowsFormsApplication1.Properties.Settings>
<setting name="prefs" serializeAs="Xml">
<value />
</setting>
</WindowsFormsApplication1.Properties.Settings>
<WindowsFormsApplication1.Test>
<setting name="steps" serializeAs="Xml">
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>Step1</string>
<string>Step2</string>
</ArrayOfString>
</value>
</setting>
<setting name="name" serializeAs="Xml">
<value>
<string>NoName</string>
</value>
</setting>
</WindowsFormsApplication1.Test>
</userSettings>http://stackoverflow.com/questions/13798528/servicestack-text-does-not-serialize-my-object-as-expected
</configuration>
*/
以下是不尝试使用ApplicationSettingsBase的示例:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;
// prefs is defined in Settings.settings with the name prefs, type WindowsFormsApplication1.Prefs, user scope, and no default value.
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Properties.Settings.Default.prefs = new Prefs();
Test test = new Test();
test.steps.Add("Step1");
test.steps.Add("Step2");
Properties.Settings.Default.prefs.tests.Add(test);
Properties.Settings.Default.Save();
Environment.Exit(0);
}
}
// WindowsFormsApplication1.Prefs
public class Prefs
{
public List<Test> tests { get; set; }
public Prefs()
{
tests = new List<Test>();
}
}
public class Test
{
public string name { get; set; }
public List<string> steps { get; set; }
public Test()
{
name = "NoName";
steps = new List<string>();
}
}
}
运行后user.config:
/*
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="WindowsFormsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<WindowsFormsApplication1.Properties.Settings>
<setting name="prefs" serializeAs="Xml">
<value>
<Prefs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<tests>
<Test>
<name>NoName</name>
<steps>
<string>Step1</string>
<string>Step2</string>
</steps>
</Test>
</tests>
</Prefs>
</value>
</setting>
</WindowsFormsApplication1.Properties.Settings>
</userSettings>
</configuration>
*/
答案 0 :(得分:0)
This answer几乎把我的问题钉在了一起:
特别是,
Properties.Settings.Default
通常会返回 Designer的一个名为Settings
的类的实例。调用Properties.Settings.Default.Save();
将只保存其中的值 对象,而不是其他类的那些。如果您要保存单独的课程
DeviceConfiguration
(正如您在发布的代码中所看到的那样),您需要处理它 明确。只需拥有一个子类的实例ApplicationSettingsBase
不会这样做。你需要拨打Save()
自定义子类的方法。
我没有意识到我的自定义结构不必放在Properties.Settings
内,以便将其保存到user.config
文件中。