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

ehxuflar  于 2023-11-21  发布在  其他
关注(0)|答案(5)|浏览(145)

我有一个小类,它包含两个字符串:

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类。

xfyts7mz

xfyts7mz1#

好了,我想我终于解决了这个问题。首先要做的是将以下属性添加到需要序列化的ReportType类的每个属性中,并从ApplicationSettingsBase继承该类:

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

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

h9a6wy2h

h9a6wy2h2#

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


示例化一个Schedules(ReportTypeSettings)对象,它会自动读取设置,你可以使用reconfigad方法刷新,例如:

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

重要提示

1.请注意,UserScoped是有意使用的。ApplicationScoped的行为不同,因此请确保您知道自己在做什么。
1.成员是公共的(包括setter),并且有一个默认的构造函数,即使它是代码所需要的。然而,使用XML的序列化 * 不能正常工作。由于时间限制,我没有调查。
1.你也可以将序列化改为二进制格式,它将使用BASE64来存储数据。
1.所有的设置都存储在一个文本文件中的XNUMX APP DATA文件夹中。

wlzqhblo

wlzqhblo3#

只是比查理的代码更清晰一点

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

字符串

zqdjd7g9

zqdjd7g94#

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

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

字符串

jtjikinw

jtjikinw5#

我想添加我自己的解决方案后,有困难的人。没有必要做任何超级特殊的得到一个自定义类/类型的属性显示在Select a Type对话框,并正确序列化的.Net Application Settings system

创建类型/类

创建一个类,就像最初的海报一样,但要注意两个重要的细节:

  • 类必须是public,并且包含一个没有任何参数的构造函数,作为类的默认状态。我找不到任何官方文档,但根据我的经验,这是成功的序列化和识别所必需的。
  • 该类必须包含在当前程序集之外的程序集中(请参见此处)。您可以通过defining the Settings by code解决此问题以及设计器的其他怪癖。

设计器准备

为了在设计器中正确显示新类型,您需要首先生成解决方案,然后关闭该解决方案。现在重新打开它,您的类型现在将可以在设置设计器中浏览。
这将足以让.Net能够将您的Type序列化为string(如果可能的话)或纯XML。

高级序列化控件

您还可以对如何序列化自定义Type类进行高级控制,而无需编写太多额外代码或重写Settings基类。
LocalFileSettingsProvider(默认由项目设置设计器使用)有一个定义的逻辑,用于确定它如何尝试序列化设置属性。如果您为类型定义了TypeConverter,则它将遵循该逻辑-否则,它将遵循Xml Serialization规则。这意味着您可以在整个类中使用Xml属性特性来控制如何将其序列化为文件。例如,如果你想完全排除某些属性,你可以通过使它们成为private来隐藏它们。

相关问题