2016-07-06 74 views
0

System.InvalidOperationException:參數對象'SI_Foodware.Model.LocalisationCollection'的類型不是原始的。 System.InvalidOperationException:生成XML文檔時發生錯誤。XmlSerializer:參數對象的類型不是原始的

LocalisationCollection.cs

using System.Xml.Serialization; 

namespace SI_Foodware.Model 
{ 
    [XmlRoot("LocalisationCollection")] 
    public class LocalisationCollection 
    { 
     [XmlArray("LocalisationItems")] 
     [XmlArrayItem("LocalisationItem", typeof(LocalisationItem))] 
     public LocalisationItem[] LocalisationItem { get; set; } 
    } 
} 

LocalisationItem.cs

using System.Xml.Serialization; 
using SQLite.Net.Attributes; 

namespace SI_Foodware.Model 
{ 
    public class LocalisationItem 
    { 
     [PrimaryKey, AutoIncrement] 
     [XmlIgnore] 
     public int Id { get; set; } 

     [XmlElement("Page")] 
     public string Page { get; set; } 

     [XmlElement("Field")] 
     public string Field { get; set; } 

     [XmlElement("Language")] 
     public string Language { get; set; } 

     [XmlElement("Value")] 
     public string Value { get; set; } 

     [XmlElement("Width")] 
     public string Width { get; set; } 

     [XmlElement("Columns")] 
     public string Columns { get; set; } 

     [XmlElement("Table")] 
     public string Table { get; set; } 

     [XmlElement("Title")] 
     public string Title { get; set; } 

     [XmlElement("Parent")] 
     public string Parent { get; set; } 

     [XmlElement("IconSource")] 
     public string IconSource { get; set; } 

     [XmlElement("TargetType")] 
     public string TargetType { get; set; } 
    } 
} 

功能將序列

public bool Serialize(string filename) 
    { 
     var path = GetPath(filename); 
     var serializer = new XmlSerializer(typeof(List<LocalisationCollection>)); 
     var writer = new FileStream(path, FileMode.Create); 
     var localisationItems = db.GetAllItems<LocalisationItem>(); 
     var collection = new LocalisationCollection(); 

     collection.LocalisationItem = localisationItems.ToArray(); 

     try 
     { 
      serializer.Serialize(writer, collection); 
      writer.Close(); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message); 
     } 
    } 

我想somethink這樣

<?xml version="1.0" encoding="utf-8"?> 
<LocalisationCollection> 
    <LocalisationItems> 
     <LocalisationItem> 
      <Language>Nederlands</Language> 
     </LocalisationItem> 
     <LocalisationItem> 
      <Language>Engels</Language> 
     </LocalisationItem> 
     <LocalisationItem> 
      <Page>LoginPage</Page> 
      <Field>grd_grid</Field> 
      <Columns>2</Columns> 
     </LocalisationItem> 
     <LocalisationItem> 
      <Page>LoginPage</Page> 
      <Field>grd_grid</Field> 
      <Width>120</Width> 
     </LocalisationItem> 
     <LocalisationItem> 
      <Page>LoginPage</Page> 
      <Field>grd_grid</Field> 
      <Width>180</Width> 
     </LocalisationItem> 
    </LocalisationItems> 
</LocalisationCollection> 
+0

您的序列化程序使用List ,但傳遞的實際對象是LocalisationCollection。要獲得所需的XML輸出,您不需要將LocalisationColleciton放入列表。 –

+0

捕獲所有異常並僅通過一條消息重新拋出一個通用異常並不是一個好主意,因爲這會消除異常類型和堆棧跟蹤。請參閱[爲什麼在C#中捕獲並重新拋出異常?](https://stackoverflow.com/questions/881473/why-catch-and-rethrow-an-exception-in-c) – dbc

回答

0

您正在嘗試與序列化的List<LocalisationCollection>構建的XmlSerializer一個LocalisationCollection

var serializer = new XmlSerializer(typeof(List<LocalisationCollection>)); 
    var collection = new LocalisationCollection(); 
    serializer.Serialize(writer, collection); 

這是行不通的。您必須使用同一類型構建的串行正在連載:

var serializer = new XmlSerializer(typeof(LocalisationCollection)); 

爲了避免這個錯誤,你可以創建以下靜態輔助方法:

public static class XmlSerializationHelper 
{ 
    public static void SerializeToFile<T>(this T obj, string path, XmlWriterSettings settings = null, XmlSerializer serializer = null) 
    { 
     if (obj == null) 
      throw new ArgumentNullException("obj"); 
     using (var stream = new FileStream(path, FileMode.Create)) 
     using (var writer = XmlWriter.Create(stream, settings)) 
     { 
      serializer = serializer ?? new XmlSerializer(obj.GetType()); 
      serializer.Serialize(writer, obj); 
     } 
    } 
} 

那麼你Serialize方法變爲:

public bool Serialize(string filename) 
    { 
     var path = GetPath(filename); 
     var localisationItems = db.GetAllItems<LocalisationItem>(); 
     var collection = new LocalisationCollection { LocalisationItem = localisationItems.ToArray() }; 

     collection.SerializeToFile(path); 

     return true; 
    } 
相關問題