我经常搜索并找到一些解决方案,但他们并不适合我。我有一些用WPF编写的GUI创建工具,我希望能够序列化对象的实例。
我已经制作了虚拟版本以检查序列化是否正常,但我得到了TargetInvocationException
。
该项目有两个标签和图像类,它们扩展了CanvasItem,一个包含CanvasItems集合的布局类,以及一个包含布局集合的项目类。
我写的序列化类:
public class XMLWrite
{
public static void WriteXML(LCTProject project)
{
System.Xml.Serialization.XmlSerializer writer =
new System.Xml.Serialization.XmlSerializer(typeof(LCTProject));
string path = Directory.GetParent(Directory.GetParent(Directory.GetParent(
System.AppDomain.CurrentDomain.BaseDirectory.ToString()).ToString()).ToString()).ToString()
+ project.name + ".xml";
System.IO.StreamWriter file = new System.IO.StreamWriter(path);
writer.Serialize(file, project);
file.Close();
}
public static LCTProject ReadXML(string name)
{
System.Xml.Serialization.XmlSerializer reader =
new System.Xml.Serialization.XmlSerializer(typeof(LCTProject));
string path = Directory.GetParent(Directory.GetParent(Directory.GetParent(
System.AppDomain.CurrentDomain.BaseDirectory.ToString()).ToString()).ToString()).ToString()
+ name + ".xml";
System.IO.StreamReader file = new System.IO.StreamReader(path);
LCTProject project = new LCTProject();
project = (LCTProject)reader.Deserialize(file);
return project;
}
}
我是如何让它运行的:
public MainWindow()
{
InitializeComponent();
LCTLabel label1 = new LCTLabel();
label1.locationX = 6;
label1.locationY = 8;
label1.alignment = CanvasItem.Alignment.Bottom;
label1.text = "hi hi hi";
label1.textSize = 12;
Color clr = new Color();
label1.color = clr;
LCTImage img = new LCTImage();
img.locationX = 1;
img.locationY = 2;
img.alignment = CanvasItem.Alignment.Right;
img.path = @"C:\";
LCTImage img2 = new LCTImage();
img2.locationX = 500;
img2.locationY = 100;
img2.alignment = CanvasItem.Alignment.Up;
img2.path = @"C:\";
LCTLayout layout1 = new LCTLayout();
LCTLayout layout2 = new LCTLayout();
layout1.items.Add(label1);
layout1.items.Add(img);
layout2.items.Add(img);
layout2.items.Add(img2);
LCTProject project = new LCTProject();
project.layouts.Add(layout1);
project.layouts.Add(layout2);
XMLWrite.WriteXML(project);
}
我得到以下例外:
TargetInvocationException未处理 类型为' System.Reflection.TargetInvocationException'的未处理异常发生在PresentationFramework.dll中 附加信息:调用目标抛出了异常。
如何解决此问题?
答案 0 :(得分:1)
当跨越远程调用时,通常会抛出此异常 application domain边界。如果你知道在哪里寻找细节,那就没有意义了。关键属性是InnerException - 您应该检查此属性以获取发生的真实异常。有可能这个属性将包含另一个TargetInvocationException实例 - 所以你应该继续挖掘InnerException链,直到你发现了一些有意义的东西。
答案 1 :(得分:0)
尝试获取跟踪和InnerException。
try
{
//somecode
}
catch (Exception e)
{
Console.WriteLine("Error trace {0}", e.Trace);
Console.WriteLine ("Inner Exception is {0}",e.InnerException);
}
答案 2 :(得分:0)
事实证明,尝试和捕捉并没有帮助。要记住两件重要的事情:
首先,使用XmlSerializer,您无法序列化没有参数的构造函数的对象。你应该添加一个没有参数的构造函数,或者如果你真的不需要构造函数,不要添加一个。
其次,序列化仅继承同一类的不同对象(不同类)的集合存在问题。假设基类是A; B和C继承A.所以你应该添加A:
的定义
[XmlInclude(typeof(B))]
[XmlInclude(typeof(C))]
public class A
{...}