2015-10-15 60 views
-1

我想将一个类序列化为具有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'


有没有一种简单的方法来做到这一点,而无需创建自定义集合类?

+1

'我添加了嵌套收集字段,“我们应该猜测你的类和代码(或者你会发布它们)吗? – Eser

+0

如果我切换到列表{{列出字符串}}我收到了CS0030,CS0029和CS0030第二次错误。 – JamesFaix

回答

0

感谢downvote,但事实证明,这个问题只是一个使用了错误的属性的物质;根据我的原始代码示例可能会提出一些建议。

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