如何将自定义类保存/序列化到设置文件?
我有一个小类,它包含两个字符串,如下所示:
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();
重要说明 :
- 请注意,故意使用UserScoped。 ApplicationScoped的行为有所不同,因此请确保您知道自己在做什么。
- 成员是公开的(包括setter),即使代码需要,也有默认的c’tor。 但是, 使用XML的序列化无法正常工作。 由于时间限制,我没有调查。
- 您也可以将序列化更改为二进制格式。 它将使用BASE64来存储数据。
- 所有设置都存储在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"] }; } }
- 如何处理多个环境的多个web.config文件?
- 在C#中,应该考虑在类之前多少行重构?
- 如何从xamarin.forms中的Google电子表格中读取数据
- 表示字符文字时使用\ u和\ x有什么区别
- 为什么GridViewRow的“FindControl”找不到下拉列表?
- 在WebBrowser中使用CookieContainer中的cookie
- ‘XDevkit.IXboxDebugTarget.GetMemory(uint,uint,byte ,out uint)’的最佳重载方法匹配有一些无效的参数
- 将权限从一个Windows文件夹复制到另一个
- 我该如何处理“CrossThreadMessagingException”?