首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ApplicationSettingsBase将自定义类保存到用户设置?

如何使用ApplicationSettingsBase将自定义类保存到用户设置?
EN

Stack Overflow用户
提问于 2012-06-16 13:40:28
回答 1查看 3.8K关注 0票数 7

我试图将一个自定义类保存到用户设置中,但没有取得多大的成功。

我用目标框架= ".NET框架4“在Visual 2010中创建了一个测试项目。主表单有两个文本框,用于显示和编辑来自我的自定义类的普通测试字符串和"Title“字段;还有两个要加载和保存设置的按钮。

最后,我添加了两个设置"TestString“(一个普通字符串值)和TestData ( MyDataClass类型--我在项目的Properties.Settings选项卡中通过选择”浏览.“来实现这一点)。从Type下拉列表中,手动在"Selected“框中输入"MyUserSettingsTest.MyDataClass”,因为它最初没有出现在可用类型列表中,但随后却出现了)。

在启动应用程序并单击LoadSettings时,事件处理程序加载普通字符串和MyData,如果失败,则创建MyDataClass的新实例。然后,我可以在表单上编辑普通字符串和测试数据标题,然后单击SaveSettings。如果我重新编辑这些值,再次单击LoadSettings,最后保存的值将按预期恢复两个值。到目前一切尚好。

问题在于,在退出应用程序并重新启动它时,普通测试字符串被恢复为ok,但MyData对象不是!显然,代码正在将MyData持久化到内存,但不是永久存储?

主要的表格代码是:

代码语言:javascript
复制
using System;
using System.Windows.Forms;

namespace MyUserSettingsTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public MyDataClass MyData {get;set;}

        private void loadSettingsButton_Click(object sender, EventArgs e)
        {
            this.myTextBox.Text = Properties.Settings.Default.TestString;
            this.MyData = Properties.Settings.Default.TestData;

            if (this.MyData == null)
            {
                this.MyData = new MyDataClass() { ID = 1, Title = "Default New Title" };
            }

            this.myDataTitleTextBox.Text = this.MyData.Title;
        }

        private void saveSettingsButton_Click(object sender, EventArgs e)
        {
            this.MyData.Title = this.myDataTitleTextBox.Text;

            Properties.Settings.Default.TestString = this.myTextBox.Text;
            Properties.Settings.Default.TestData = this.MyData;
            Properties.Settings.Default.Save();
        }
    }
}

我的测试数据类代码是:

代码语言:javascript
复制
using System.Configuration;

namespace MyUserSettingsTest
{
    public class MyDataClass : ApplicationSettingsBase
    {
        public MyDataClass()
        {
        }

        private int _id;
        private string _title;

        [UserScopedSetting()]
        [SettingsSerializeAs(SettingsSerializeAs.Xml)] 
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }

        [UserScopedSetting()]
        [SettingsSerializeAs(SettingsSerializeAs.Xml)] 
        public string Title
        {
            get { return _title; }
            set { _title = value; }
        }
    }
}

我不知道它是否有帮助,但是自动生成的app.config文件(它包含TestString的设置,而不是TestData!)是:

代码语言:javascript
复制
<?xml version="1.0"?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <section name="MyUserSettingsTest.Properties.Settings"     type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
        </sectionGroup>
    </configSections>
    <userSettings>
        <MyUserSettingsTest.Properties.Settings>
            <setting name="TestString" serializeAs="String">
                <value/>
            </setting>
        </MyUserSettingsTest.Properties.Settings>
    </userSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

自动生成的Settings.Designer.cs文件是:

代码语言:javascript
复制
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.269
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace MyUserSettingsTest.Properties {


[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {

    private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

    public static Settings Default {
        get {
            return defaultInstance;
        }
    }

    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute("")]
    public string TestString {
        get {
            return ((string)(this["TestString"]));
        }
        set {
            this["TestString"] = value;
        }
    }

    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public global::MyUserSettingsTest.MyDataClass TestData {
        get {
            return ((global::MyUserSettingsTest.MyDataClass)(this["TestData"]));
        }
        set {
            this["TestData"] = value;
        }
    }
}
}

请任何人告诉我,我做错了什么,或者我需要做什么额外的,以使我的自定义类,以坚持正确的用户设置。

EN

回答 1

Stack Overflow用户

发布于 2014-11-13 23:14:36

将自定义对象保存为序列化字符串。那么你只需要存储一个字符串。例如,使用Json .NET JsonConverter来序列化和反序列化对象。

代码语言:javascript
复制
Properties.Settings.Default.TestData = JsonConvert.SerializeObject<MyDataClass>(this.MyData);

然后你可以像这样把它读回来

代码语言:javascript
复制
this.MyData = JsonConvert.DeserializeObject<MyDataClass>(Properties.Settings.Default.TestData);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11063928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档