[英]Custom Settings-class exception on first use (ApplicationSettingsBase)
[英]How do I save a custom class to user settings using ApplicationSettingsBase?
我正在嘗試將自定義類保存到用戶設置但沒有取得多大成功。
我在Visual Studio 2010中使用Target framework =“.NET Framework 4”創建了一個測試項目。 主窗體有兩個文本框,用於顯示和編輯普通測試字符串以及我的自定義類中的“標題”字段; 連同兩個按鈕加載和保存設置。
最后,我添加了兩個設置“TestString”(一個普通的字符串值)和TestData(MyDataClass的類型 - 我在項目的Properties.Settings選項卡中通過從Type下拉列表中選擇“Browse ...”然后手動輸入“MyUserSettingsTest”來完成此操作.MyDataClass“在”選定類型“框中,因為它最初沒有顯示在可用類型列表中,但隨后它出現在。
在啟動應用程序並單擊LoadSettings時,事件處理程序將加載純字符串和MyData,如果失敗,則會創建MyDataClass的新實例。 然后,我可以在表單上編輯純字符串並測試數據標題,然后單擊SaveSettings。 如果我然后重新編輯值,請再次單擊“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;
}
}
}
}
請任何人都可以告訴我我做錯了什么,或者需要做些什么才能使我的自定義類能夠正確地保持用戶設置。
將自定義對象保存為序列化字符串。 然后你只需要存儲一個字符串。 例如,使用Json .NET JsonConverter序列化和反序列化對象。
Properties.Settings.Default.TestData = JsonConvert.SerializeObject<MyDataClass>(this.MyData);
然后你可以這樣讀回來
this.MyData = JsonConvert.DeserializeObject<MyDataClass>(Properties.Settings.Default.TestData);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.