将自定义类的集合添加到 Settings.Settings

Posted

技术标签:

【中文标题】将自定义类的集合添加到 Settings.Settings【英文标题】:Add a collection of a custom class to Settings.Settings 【发布时间】:2011-10-23 10:59:55 【问题描述】:

我一直在尝试将自定义类的自定义集合添加到我的 winforms 项目的应用程序设置中,我觉得我已经尝试了大约六种不同的方式,包括this way、this way、@ 987654323@ 和 this way 但似乎没有任何效果......

目前代码符合要求,并且运行良好 - 任何地方都没有例外。对他的保存功能进行编码,但在设置 xml 文件中没有创建任何条目(我有一些其他设置,它适用于所有设置,但仅供参考)。加载时,Properties.Settings.Default.LastSearches 始终为空...有什么想法吗?

这是我当前的代码:

类:

[Serializable]
public class LastSearch : ISerializable

    public DateTime Date  get; set; 
    public string Hour  get; set; 
    public string Log  get; set; 
    public string Command  get; set; 
    public List<string> SelectedFilters  get; set; 
    public List<string> SearchTerms  get; set; 
    public List<string> HighlightedTerms  get; set; 
    public List<string> ExcludedTerms  get; set; 

    public LastSearch(DateTime date, string hour, string log, string command, List<string> selectedFilters,
        List<string> searchTerms, List<string> highlightedTerms, List<string> excludedTerms)
    
        Date = date.ToUniversalTime();
        Hour = hour;
        Log = log;
        Command = command;
        SelectedFilters = selectedFilters;
        SearchTerms = searchTerms;
        HighlightedTerms = highlightedTerms;
        ExcludedTerms = excludedTerms;
    

    protected LastSearch(SerializationInfo info, StreamingContext context)
    
        Date = info.GetDateTime("Date");
        Hour = info.GetString("Hour");
        Log = info.GetString("Log");
        Command = info.GetString("Command");
        SelectedFilters = (List<string>)info.GetValue("SelectedFilters", typeof(List<string>));
        SearchTerms = (List<string>)info.GetValue("SearchTerms", typeof(List<string>));
        HighlightedTerms = (List<string>)info.GetValue("HighlightedTerms", typeof(List<string>));
        ExcludedTerms = (List<string>)info.GetValue("ExcludedTerms", typeof(List<string>));
    
    [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    
        info.AddValue("Date", Date);
        info.AddValue("Hour", Hour);
        info.AddValue("Log", Log);
        info.AddValue("Command", Command);
        info.AddValue("SelectedFilters", SelectedFilters);
        info.AddValue("SearchTerms", SearchTerms);
        info.AddValue("HighlightedTerms", HighlightedTerms);
        info.AddValue("ExcludedTerms", ExcludedTerms);
    


[Serializable]
public class LastSearchCollection : ISerializable

    public List<LastSearch> Searches  get; set; 

    public LastSearchCollection()
    
        Searches = new List<LastSearch>();
    

    public LastSearchCollection(SerializationInfo info, StreamingContext ctxt)
    
        Searches = (List<LastSearch>)info.GetValue("LastSearches", typeof(List<LastSearch>));
    
    [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    
        info.AddValue("Searches", Searches);
    

写入设置:

if (RecentQueriesToolStripMenuItem.DropDownItems.Count > 0)

    // Last Search Settings
    if (Properties.Settings.Default.LastSearches == null)
        Properties.Settings.Default.LastSearches = new LastSearchCollection();

    Properties.Settings.Default.LastSearches.Searches.Clear();
    foreach (LastSearchMenuItem item in RecentQueriesToolStripMenuItem.DropDownItems)
    
        Properties.Settings.Default.LastSearches.Searches.Add(item.SearchData);
    


// Save all settings
Properties.Settings.Default.Save();

从设置加载

// Last Searches
if (Properties.Settings.Default.LastSearches != null)

    int i = 0;
    foreach (LastSearch search in Properties.Settings.Default.LastSearches.Searches)
    
        LastSearchMenuItem searchMenuItem = new LastSearchMenuItem(search);
        RecentQueriesToolStripMenuItem.DropDownItems.Add(searchMenuItem);
        RecentQueriesToolStripMenuItem.DropDownItems[i].Click += new EventHandler(RecentSearch_Click);
        i++;
    

【问题讨论】:

我能问一下您为什么要尝试将其存储在用户设置中吗?为什么不直接将你的类序列化到磁盘? @Jethro 这正是内置用户设置的真正作用。我已经在其中设置了所有其他设置,因此尝试将它们保持在一起是有意义的。 你看过这篇关于如何持久化自定义类的文章。 codeproject.com/KB/cs/WinAppUserSettings.aspx @Jethro 谢谢!但是我仍然想尝试使用内置设置来完成这项工作 @Jethro 好吧,我最终使用了你的链接,所以如果你把它作为答案我会接受它 【参考方案1】:

8 年多之后,我的需求和你一样。我使用 XML 序列化将自定义集合存储在用户设置中解决了它。

这是您的代码采用的示例。

首先您需要将设置的类型设置为您的集合类的类型(例如“MyProject.LastSearchCollection”)。请参阅Why am I unable to select a custom Type for a setting from the same project/assembly as the settings file? 了解如何执行此操作。 如果 Visual Studio 说它找不到您的自定义类,请确保该类是公共的并且具有公共的无参数构造函数。

自定义类:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Runtime.Serialization;

namespace MyProject

    [SettingsSerializeAs(SettingsSerializeAs.Xml)]
    public class LastSearch
    
        public DateTime Date  get; set; 
        public string Hour  get; set; 
        public string Log  get; set; 
        public string Command  get; set; 
        public List<string> SelectedFilters  get; set; 
        public List<string> SearchTerms  get; set; 
        public List<string> HighlightedTerms  get; set; 
        public List<string> ExcludedTerms  get; set; 

        public LastSearch(DateTime date, string hour, string log, string command, List<string> selectedFilters,
            List<string> searchTerms, List<string> highlightedTerms, List<string> excludedTerms)
        
            Date = date.ToUniversalTime();
            Hour = hour;
            Log = log;
            Command = command;
            SelectedFilters = selectedFilters;
            SearchTerms = searchTerms;
            HighlightedTerms = highlightedTerms;
            ExcludedTerms = excludedTerms;
        

        protected LastSearch(SerializationInfo info, StreamingContext context)
        
            Date = info.GetDateTime("Date");
            Hour = info.GetString("Hour");
            Log = info.GetString("Log");
            Command = info.GetString("Command");
            SelectedFilters = (List<string>)info.GetValue("SelectedFilters", typeof(List<string>));
            SearchTerms = (List<string>)info.GetValue("SearchTerms", typeof(List<string>));
            HighlightedTerms = (List<string>)info.GetValue("HighlightedTerms", typeof(List<string>));
            ExcludedTerms = (List<string>)info.GetValue("ExcludedTerms", typeof(List<string>));
        
    

    [SettingsSerializeAs(SettingsSerializeAs.Xml)]
    public class LastSearchCollection
    
        public List<LastSearch> Searches  get; set; 

        public LastSearchCollection()
        
            Searches = new List<LastSearch>();
        

        public LastSearchCollection(SerializationInfo info, StreamingContext ctxt)
        
            Searches = (List<LastSearch>)info.GetValue("LastSearches", typeof(List<LastSearch>));
        
    

唯一的区别是,我添加了[SettingsSerializeAs(SettingsSerializeAs.Xml)] 属性并删除了您的序列化函数。 您可能需要将引用 System.Configuration 添加到您的项目中。

像这样保存设置:

LastSearchCollection searches =  new LastSearchCollection();

List<string> selectedFilters = new List<string>();
selectedFilters.Add("Filter1");
selectedFilters.Add("Filter2");
selectedFilters.Add("FilterN");

searches.Searches.Add(new LastSearch(DateTime.Now, "7", "Log1", "CommandA", selectedFilters, new List<string>(), new List<string>(), new List<string>()));
searches.Searches.Add(new LastSearch(DateTime.Now, "9", "Log2", "CommandB", new List<string>(), new List<string>(), new List<string>(), new List<string>()));
Properties.Settings.Default.LastSearches = searches;

// Save all settings
Properties.Settings.Default.Save();

之后写入光盘的 user.config 将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
    ...
    </configSections>
    <userSettings>
    ...
        <MyProject.Properties.Settings>
            <setting name="LastSearches" serializeAs="Xml">
                <value>
                    <LastSearchCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <Searches>
                            <LastSearch>
                                <Date>2020-03-01T07:49:44.5512864Z</Date>
                                <Hour>7</Hour>
                                <Log>Log1</Log>
                                <Command>CommandA</Command>
                                <SelectedFilters>
                                    <string>Filter1</string>
                                    <string>Filter2</string>
                                    <string>FilterN</string>
                                </SelectedFilters>
                                <SearchTerms />
                                <HighlightedTerms />
                                <ExcludedTerms />
                            </LastSearch>
                            <LastSearch>
                                <Date>2020-03-01T07:49:44.5562864Z</Date>
                                <Hour>9</Hour>
                                <Log>Log2</Log>
                                <Command>CommandB</Command>
                                <SelectedFilters />
                                <SearchTerms />
                                <HighlightedTerms />
                                <ExcludedTerms />
                            </LastSearch>
                        </Searches>
                    </LastSearchCollection>
                </value>
            </setting>
        </MyProject.Properties.Settings>
    </userSettings>
</configuration>

【讨论】:

以上是关于将自定义类的集合添加到 Settings.Settings的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义数组保存/重新加载到 plist

将自定义常量添加到系统常量[重复]

将自定义标头添加到 AFNetworking,我做错了啥?

将自定义标记 (HTMLMarkers) 添加到聚类

如何将自定义挂钩添加到 Woocommerce 的自定义插件

AWS Elastic Beanstalk:将自定义日志添加到 CloudWatch?