簡體   English   中英

未處理TargetInvocationException

[英]TargetInvocationException was unhandled

我進行了很多搜索,找到了一些解決方案,但是它們對我不起作用。 我有一些用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。PresentationFramework.dll中發生了類型為'System.Reflection.TargetInvocationException'的未處理異常。其他信息:調用的目標引發了異常。

我該如何解決這個問題?

當跨應用程序域邊界進行遠程調用時,通常會引發此異常。 如果您知道在哪里查找細節,那並不是沒有意義的。 關鍵屬性是InnerException-您應該檢查該屬性以獲得發生的真正異常。 該屬性可能會包含另一個TargetInvocationException實例-因此,您應該繼續研究InnerException鏈,直到發現有意義的東西為止。

嘗試獲取跟蹤和InnerException。

    try
    {
    //somecode
    }
    catch (Exception e)
    {
     Console.WriteLine("Error trace {0}", e.Trace);
     Console.WriteLine ("Inner Exception is {0}",e.InnerException);
    }

事實證明,嘗試和捕捉無濟於事。 有兩件重要的事情要記住:

首先,使用XmlSerializer不能序列化沒有構造函數且沒有參數的對象。 您應該添加一個不帶參數的構造函數,或者如果您確實不需要構造函數,請不要添加一個。

其次,在序列化僅繼承同一類的不同對象(不同類)的集合時出現問題。 假設基類是A; B和C繼承了A。因此,您應該添加A的定義:

[XmlInclude(typeof(B))]
[XmlInclude(typeof(C))]
public class A
{...}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM