ApplicationSettingsBase没有按预期序列化我的类

本文关键字:序列化 我的 ApplicationSettingsBase | 更新日期: 2023-09-27 18:28:04

我正试图使用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>
*/

ApplicationSettingsBase没有按预期序列化我的类

这个答案几乎解决了我的问题:

特别是,Properties.Settings.Default通常会返回设计器创建的名为Settings的类的实例。使命感Properties.Settings.Default.Save();将只保存其中的值对象,而不是其他类中的对象。

如果您有一个要保存的单独类DeviceConfiguration(正如你在发布的代码中所看到的那样),你需要处理好明确地简单地拥有的子类的实例ApplicationSettingsBase做不到。你需要打电话给Save()方法。

我没有意识到,我的自定义结构不必放在Properties.Settings中,就可以保存到user.config文件中。