如何保存/序列化自定义类的设置文件?(How do I save/serialize a custo

2019-07-03 12:57发布

我有一个持有两个字符串如下小班:

    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类当前的命名空间。

Answer 1:

好,我想我最终算出来。 要做的第一件事就是到下面的属性添加到需要被序列化和继承ApplicationSettingsBase类的REPORTTYPE类的每个属性:

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

..............

然后,一旦你已经重建的组件(重要!),你可以进入设置界面,点击浏览,然后在下方的文本框中键入您的命名空间和类名(如Label_Creator.ReportType)。 命名空间和类名没有出现在树中,因此这部分是不完全明显,你需要做的这就是为什么它是一个有点混乱什么....



Answer 2:

@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<Schedule> Entries
    {
        get { return (List<Schedule>)this[nameof(Entries)]; }
        set { this[nameof(Entries)] = value; }
    }
}

实例化一个排定(ReportTypeSettings)对象。 它会自动读取设置。 您可以使用刷新方法来刷新。 例如:

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

重要提示

  1. 需要注意的是UserScoped有意使用。 ApplicationScoped行为不同,所以一定要确保你知道你在做什么。
  2. 成员是公共的(包括二传手),而且也尽管它需要的代码默认c'tor。 但是, 使用XML序列化没有正常工作。 由于时间的限制,我没有调查。
  3. 您可以更改序列化的二进制格式为好。 它将使用BASE64来存储数据。
  4. 所有设置都被存储在本地APP DATA文件夹,在文本文件中。


Answer 3:

如何创建返回从配置文件中包含的数据REPORTTYPE实例的静态方法。 所以,很简单,我不认为序列化是必要的。

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


Answer 4:

只是有点更清晰的代码,然后查理

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


文章来源: How do I save/serialize a custom class to the settings file?