7

カスタム クラスをユーザー設定に保存しようとしていますが、うまくいきません。

Visual Studio 2010 でターゲット フレームワーク = ".NET Framework 4" のテスト プロジェクトを作成しました。メイン フォームには、プレーン テスト文字列とカスタム クラスの「タイトル」フィールドを表示および編集するための 2 つのテキスト ボックスがあります。設定をロードおよび保存するための 2 つのボタンと一緒に。

最後に、「TestString」(プレーンな文字列値) と TestData (MyDataClass のタイプ) の 2 つの設定を追加しました。プロジェクトの [Properties.Settings] タブで [タイプ] ドロップダウン リストから [参照...] を選択し、手動で「MyUserSettingsTest」と入力してこれを行いました。 .MyDataClass" を [選択されたタイプ] ボックスに追加します。これは、最初は使用可能なタイプのリストに表示されませんでしたが、その後表示されるためです。)

アプリケーションを起動して LoadSettings をクリックすると、イベント ハンドラーはプレーン文字列と MyData をロードします。これが失敗した場合は、MyDataClass の新しいインスタンスを作成します。次に、フォームのプレーン文字列とテスト データのタイトルを編集し、[設定を保存] をクリックします。その後、値を再編集すると、LoadSettings を再度クリックすると、最後に保存された値が両方の値に対して期待どおりに復元されます。ここまでは順調ですね。

問題は、アプリケーションを終了して再起動すると、プレーンなテスト文字列は正常に復元されますが、MyData オブジェクトは復元されないことです! 明らかに、コードは MyData をメモリに永続化していますが、永続ストアには永続化していませんか?

メイン フォーム コードは次のとおりです。

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();
        }
    }
}

私のテストデータクラスのコードは次のとおりです。

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 ではありません!!?) は次のとおりです。

<?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 ファイルは次のとおりです。

//------------------------------------------------------------------------------
// <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;
        }
    }
}
}

私が間違っていること、またはカスタムクラスをユーザー設定に適切に保持するために何をする必要があるかを誰か教えてください。

4

1 に答える 1

2

カスタム オブジェクトをシリアル化された文字列として保存します。次に、文字列を保存するだけです。たとえば、Json .NET JsonConverter を使用して、オブジェクトをシリアル化および逆シリアル化します。

Properties.Settings.Default.TestData = JsonConvert.SerializeObject<MyDataClass>(this.MyData);

次に、このように読み返すことができます

this.MyData = JsonConvert.DeserializeObject<MyDataClass>(Properties.Settings.Default.TestData);
于 2014-11-13T23:14:36.693 に答える