是否可以将自定义对象的 ArrayList 保存到应用程序用户设置而不诉诸自定义序列化?
例如,给定一个仅包含公共获取/设置属性和私有支持字段的基本数据类:
[Serializable]
class SimpleClass()
{
...
}
当我在代码中运行以下代码,然后重新启动应用程序时,名为 MyList 的 ArrayList 设置始终为 null,即未保存。
if (Properties.Settings.Default.MyList==null)
{
Properties.Settings.Default.MyList=new ArrayList();
}
Properties.Settings.Default.MyList.Add(new SimpleClass(DateTime.Now.ToString()));
Properties.Settings.Default.Save();
我意识到 ArrayList 没有类型化,即。它包含对象的集合。 然而,在每个对象上使用 GetType() 来确定实际类型很简单。 这应该允许序列化发生,不是吗?
我也知道如何解决这个问题,执行一些自定义序列化。 这只是一种痛苦,这似乎不起作用,因为对于更简单的情况来说,它是迄今为止最方便的。
有什么想法吗?
如果您使用 XML 序列化,则可以使用 XmlArrayItem 属性。
[XmlArray("Items")]
[XmlArrayItem("A.Thing",typeof(Thing))]
[XmlArrayItem("A.Different.Thing",typeof(Whatzit))]
public System.Collections.ArrayList List;
这要求您在编译时知道 ArrayList 中可能存在的不同类型。
我找到了在用户设置中保存自定义对象集合问题的解决方案。为此,您不能使用项目设计者建议的 ArrayList 类型,因为为了进行序列化,必须静态(在编译时)了解 ArrayList 中项目的类型。例如,如果项目是字符串类型,它可以正常工作,但如果是自定义对象,则它不起作用。事实上,您不能在项目设计器中声明该列表,但您可以创建一个自定义代码模块(我将其称为 SettingsCustom.cs),该模块扩展由项目设计器创建的 Settings 类(在 Settings.Designer.cs 中)。在下面的示例中,我创建了 MyParameterSet 对象的模板化列表,而不是 ArrayList,其类型在编译时已知。我用于声明 MyParameterSet 类的唯一属性是 [Serializable]。
using System.Collections.Generic;
using System.Xml.Serialization;
namespace MyProject.Properties
{
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public List<MyParameterSet> lstParams {
get {
return ((List<MyParameterSet>)(this["lstParams"]));
}
set {
this["lstParams"] = value;
}
}
}
}