如何将自定义类保存/序列化到设置文件?

我有一个小类,它包含两个字符串,如下所示:

public class ReportType { private string displayName; public string DisplayName { get { return displayName; } } private string reportName; public string ReportName { get { return reportName; } } public ReportType(string displayName, string reportName) { this.displayName = displayName; this.reportName = reportName; } } 

我想将此类的实例保存到我的设置文件中,以便我可以执行以下操作:

 ReportType reportType = Settings.Default.SelectedReportType; 

谷歌搜索似乎表明这是可能的,但似乎没有任何明确的指南可供我遵循。 我知道有些序列化是必需的,但不知道从哪里开始。 此外,当我进入Visual Studio的“设置”屏幕并单击“类型”列下的“浏览”时,没有选项可以选择包含ReportType类的当前命名空间。

好吧,我认为我最终解决了这个问题。 要做的第一件事是将以下属性添加到需要序列化的ReportType类的每个属性,并从ApplicationSettingsBaseinheritance该类:

  public class ReportType : ApplicationSettingsBase { private string displayName; [UserScopedSetting()] [SettingsSerializeAs(System.Configuration.SettingsSerializeAs.Xml)] public string DisplayName { get { return displayName; } } 

…………..

然后,一旦重建了程序集(重要!),您可以进入设置屏幕并单击浏览,然后在底部的文本框中键入您的命名空间和类名(例如Label_Creator.ReportType)。 命名空间和类名称不会出现在树中,所以这部分并不是很明显你需要做什么,这就是为什么它有点令人困惑….

@Calanus解决方案对我不起作用(在Visual Studio 2015上)。 缺少的步骤实际上是设置或从实际设置中获取。 至于原来的问题,实现一个简单的POCO可以这样实现:

 [Serializable] public class ReportType { public string DisplayName { get; set; } public string ReportName { get; set; } public ReportType() { } public ReportType(string displayName, string reportName) { DisplayName = displayName; ReportName = reportName; } } // the class responsible for reading and writing the settings public sealed class ReportTypeSettings : ApplicationSettingsBase { [UserScopedSetting] [SettingsSerializeAs(SettingsSerializeAs.Xml)] [DefaultSettingValue("")] public ReportType ReportType { get { return (ReportType)this[nameof(ReportType)]; } set { this[nameof(ReportType)] = value; } } } 

我用于实际序列化列表:

 [Serializable] public class Schedule { public Schedule() : this(string.Empty, DateTime.MaxValue) { } public Schedule(string path, DateTime terminationTime) { path = driverPath; TerminationTime = terminationTime; } public DateTime TerminationTime { get; set; } public string Path { get; set; } } public sealed class Schedules : ApplicationSettingsBase { [UserScopedSetting] [SettingsSerializeAs(SettingsSerializeAs.Xml)] [DefaultSettingValue("")] public List Entries { get { return (List)this[nameof(Entries)]; } set { this[nameof(Entries)] = value; } } } 

实例化一个Schedules(ReportTypeSettings)对象。 它会自动读取设置。 您可以使用重新加载方法进行刷新。 例如:

 ReportTypeSettings rts = new ReportTypeSettings(); rts.Reload(); rts.ReportType = new ReportType("report!", "report1"); rts.Save(); 

重要说明

  1. 请注意,故意使用UserScoped。 ApplicationScoped的行为有所不同,因此请确保您知道自己在做什么。
  2. 成员是公开的(包括setter),即使代码需要,也有默认的c’tor。 但是, 使用XML的序列化无法正常工作。 由于时间限制,我没有调查。
  3. 您也可以将序列化更改为二进制格式。 它将使用BASE64来存储数据。
  4. 所有设置都存储在LOCAL APP DATA文件夹中的文本文件中。

如何创建一个静态方法,该方法返回包含配置文件中数据的ReportType实例。 它更简单,我不认为序列化是必要的。

 public class ReportType { public static ReportType GetDefaultSelectedReportType() { string displayName = ConfigurationManager.AppSettings["DefaultDisplayName"]; string reportName = ConfigurationManager.AppSettings["DefaultReportName"]; return new ReportType(displayName, reportName); } . . . } 

然后查理的代码就更加清晰了

 public class ReportType { public static ReportType CreateDefaults() { return new ReportType { DisplayName = ConfigurationManager.AppSettings["DefaultDisplayName"], ReportName = ConfigurationManager.AppSettings["DefaultReportName"] }; } }