c#将嵌套列表序列化为XML

本文关键字:XML 序列化 列表 嵌套 | 更新日期: 2023-09-27 18:18:05

我想将一个类序列化为XML,该类的字段类型为List{List{String}}或String[][]或List{String[]}。在我添加嵌套集合字段之前,我的类的序列化和反序列化很好,但是现在在序列化或反序列化时抛出InvalidOperationException。

对于这个特定的实例,我真的不在乎是否必须使用数组或列表,但是如果知道一个可以用于任何嵌套集合情况的通用解决方案就很好了。


当前我的字段是这样声明的:

[XmlElement("foo")]
public List<String[]> foo;

这在过去的单级列表和数组中对我来说工作得很好。


下面是完整的类:

[XmlRoot("ColumnUpdaterPrefs")]
public class ColumnUpdaterPrefs : Prefs {
    public ColumnUpdaterPrefs() : base() {
        defaultHeaders = new List<String[]>();
    }
    [XmlAttribute("autoFill")]
    public Boolean autoFill = true;
    [XmlAttribute("allowErrors")]
    public Boolean allowErrors;
    [XmlAttribute("allowZeroes")]
    public Boolean allowZeroes;
    [XmlElement("defaultHeaders")]
    public List<String[]> defaultHeaders;
    [XmlElement("defaultKey")]
    public String defaultKey;
    public override Object Clone() { 
        return new ColumnUpdaterPrefs() {
            autoFill = this.autoFill,
            allowErrors = this.allowErrors,
            allowZeroes = this.allowZeroes,
            defaultHeaders = this.defaultHeaders,
            defaultKey = this.defaultKey
        }; 
    }
}

和它的基类:

[Serializable]
public abstract class Prefs : ICloneable {
    [XmlAttribute("name")]
    public String name;
    public Prefs(String name = null) {
        this.name = name;
    }
    public String Serialize() {
        var xs = new XmlSerializer(this.GetType()); //InvalidOperationException occurs here
        using (var sw = new StringWriter()) {
            xs.Serialize(sw, this);
            var result = sw.ToString();
            return result;
        }
    }
    public static TPrefs Deserialize<TPrefs>(String xml) 
        where TPrefs : Prefs {
        var xs = new XmlSerializer(typeof(TPrefs)); //InvalidOperationException occurs here
        using (var sr = new StringReader(xml)) {
            var result = (TPrefs)(xs.Deserialize(sr));
            return result;
        }
    }
    public void Write(ApplicationSettingsBase settings, Boolean save = false, String name = null) {
        if (settings == null) throw new ArgumentNullException("settings");
        if (name == null) name = this.name;
        settings[name] = Serialize();
        if (save) settings.Save();           
    }
    public static TPrefs Read<TPrefs>(ApplicationSettingsBase settings, String name)
        where TPrefs : Prefs {
        if (settings == null) throw new ArgumentNullException("settings");
        return Deserialize<TPrefs>((String)settings[name]);
    }
    public static TPrefs ReadOrDefault<TPrefs>(ApplicationSettingsBase settings, String name)
        where TPrefs : Prefs, new() {
        try { return Read<TPrefs>(settings, name); }
        catch { return new TPrefs() { name = name }; }
    }
    public abstract Object Clone();
}

下面是异常的详细信息:

类型为'System '的第一次异常。在System.Xml.dll中发生InvalidOperationException'附加信息:无法生成临时类(result=1)。不能转换类型"System.Collections.Generic"。列表'到'string[]'错误CS0029:无法隐式地将类型"string[]"转换为"System.Collections.Generic.List"


是否有一个简单的方法来做到这一点,而不创建自定义集合类?

c#将嵌套列表序列化为XML

感谢您的投票,但事实证明,问题只是使用错误的属性;根据我原来的代码样本,可以提出一些建议。

[XmlArray("outerList")]
[XmlArrayItem("innerList", typeof(List<String>))]
public List<List<String>> foo;