【发布时间】: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 好吧,我最终使用了你的链接,所以如果你把它作为答案我会接受它
标签: c# winforms serialization .net-4.0 settings