2016-07-06 6 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

Ловля всех исключений и повторное создание общего исключения с помощью только сообщения не является хорошей идеей, так как это стирает тип исключения и трассировку стека. См. [Почему catch и ретронирование исключения в C#?] (Https://stackoverflow.com/questions/881473/why-catch-and-rethrow-an-exception-in-c) – dbc

ответ

0

Вы пытаетесь сериализовать LocalisationCollectionXmlSerializer с построенной для List<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; 
    } 
Смежные вопросы