2016-07-06 73 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; 
    } 
相关问题