【问题标题】:XmlSerializer causes XamlParseExceptionXmlSerializer 导致 XamlParseException
【发布时间】:2015-03-18 13:18:56
【问题描述】:

我有一个简单的 WPF 应用程序,当我尝试使用 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'。

可能是什么问题?

【问题讨论】:

  • @ThomasLindvall 这不是问题。

标签: c# xml wpf exception serialization


【解决方案1】:

如果您将其作为孤立的问题进行测试,您会看到XmlSerializer 抛出带有消息的InvalidOperationException

存在错误反映类型“System.IO.IOException”。

内部异常详细描述了原因:

无法序列化 System.Collections.IDictionary 类型的成员 System.Exception.Data,...

字典不能用 .NET XML 序列化器序列化。就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多