2015-03-18 4 views
0

У меня есть простое приложение WPF, и когда я пытаюсь сериализовать простой Exception с XmlSerializer, я получаю исключение XamlParseException.XmlSerializer вызывает XamlParseException

Код в MainWindow.xaml является:

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 

</Grid> 
</Window> 

Код в App.xaml является:

<Application x:Class="WpfApplication2.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="MainWindow.xaml"> 
<Application.Resources> 

</Application.Resources> 

Код Serializer статический класс используется для сериализации:

public static class Serializer<T> 
{ 
    /// <summary> 
    /// serialize an instance to xml 
    /// </summary> 
    /// <param name="instance"> instance to serialize </param> 
    /// <returns> instance as xml string </returns> 
    public static string Serialize(T instance) 
    { 
     StringBuilder sb = new StringBuilder(); 
     XmlWriterSettings settings = new XmlWriterSettings(); 

     using (XmlWriter writer = XmlWriter.Create(sb, settings)) 
     { 
      XmlSerializer serializer = new XmlSerializer(instance.GetType()); 
      serializer.Serialize(writer, instance); 
     } 

     return sb.ToString(); 
    } 

    /// <summary> 
    /// deserialize an xml into an instance 
    /// </summary> 
    /// <param name="xml"> xml string </param> 
    /// <returns> instance </returns> 
    public static T Deserialize(string xml) 
    { 
     using (XmlReader reader = XmlReader.Create(new StringReader(xml))) 
     { 
      foreach (Type t in types) 
      { 
       XmlSerializer serializer = new XmlSerializer(t); 
       if (serializer.CanDeserialize(reader)) 
        return (T)serializer.Deserialize(reader); 
      } 
     } 

     return default(T); 
    } 

    /// <summary> 
    /// store all derived types of T: 
    /// is used in deserialization 
    /// </summary> 
    private static Type[] types = AppDomain.CurrentDomain.GetAssemblies() 
             .SelectMany(s => s.GetTypes()) 
             .Where(t => typeof(T).IsAssignableFrom(t) 
              && t.IsClass 
              && !t.IsGenericType) 
              .ToArray(); 
} 

Код в MainWindow.xaml.cs является:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication2 
{ 
    /// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Exception e = new System.IO.IOException("blablabla", new System.IO.DirectoryNotFoundException()); 
     MessageBox.Show(Serializer<Exception>.Serialize(e)); 
    } 
    } 
    } 

И когда я запускаю это, я получаю это исключение:

«Вызов конструктора по типу „WpfApplication2.MainWindow“, что соответствует указанному привязке. ограничений выбрасывает исключение. ' Номер линии «3» и позиция линии '9'.

В чем проблема?

+0

@ThomasLindvall Это не проблема. – helb

ответ

2

То, что вы увидели бы, если вы испытали это как изолированной проблемой было то, что XmlSerializer бросает InvalidOperationException с сообщением

Был ошибка типа reflectig «System.IO.IOException» ,

Внутреннее исключение имеет подробное описание, почему:

Не можете сериализовать член System.Exception.Data типа System.Collections.IDictionary ...

Словари могут не сериализовать с .NET XML Serializer. Ничего не поделаешь.

Смежные вопросы