2015-10-15 62 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;