将自定义对象的 ArrayList 保存到用户设置

问题描述 投票:0回答:2

是否可以将自定义对象的 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() 来确定实际类型很简单。 这应该允许序列化发生,不是吗?

我也知道如何解决这个问题,执行一些自定义序列化。 这只是一种痛苦,这似乎不起作用,因为对于更简单的情况来说,它是迄今为止最方便的。

有什么想法吗?

c# .net serialization settings
2个回答
1
投票

如果您使用 XML 序列化,则可以使用 XmlArrayItem 属性。

 [XmlArray("Items")]
 [XmlArrayItem("A.Thing",typeof(Thing))]
 [XmlArrayItem("A.Different.Thing",typeof(Whatzit))]
 public System.Collections.ArrayList List;

这要求您在编译时知道 ArrayList 中可能存在的不同类型。


0
投票

我找到了在用户设置中保存自定义对象集合问题的解决方案。为此,您不能使用项目设计者建议的 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;
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.