我想将一个类序列化为具有List {List {String}}或String [] []或List {String []}类型字段的XML。在我添加嵌套收集字段之前,我的类正在序列化和反序列化,但是现在在序列化或反序列化时抛出InvalidOperationException。C#将嵌套列表序列化为XML
我真的不关心,如果我有使用数组或列出了这个特定的实例,但它会很高兴地知道,可用于任何嵌套的收集情况的通用解决方案。
目前我场声明如下:
[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();
}
以下是异常的详细信息:
第一次机会异常类型'Sy在System.Xml.dll中发生了“stem.InvalidOperationException” 附加信息:无法生成临时类(结果= 1)。 错误CS0030:无法将类型 'System.Collections.Generic.List' 到 '字符串[]' 错误CS0029:无法隐式转换类型 '字符串[]' 到 'System.Collections.Generic.List'
有没有一种简单的方法来做到这一点,而无需创建自定义集合类?
'我添加了嵌套收集字段,“我们应该猜测你的类和代码(或者你会发布它们)吗? – Eser
如果我切换到列表{{列出字符串}}我收到了CS0030,CS0029和CS0030第二次错误。 – JamesFaix