Laden...

Serialization BinaryFormatter problem beim Laden

Erstellt von kinamee vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.513 Views
K
kinamee Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren
Serialization BinaryFormatter problem beim Laden

Hallo Community,

ich versuche derzeit bestimmte Daten meines Programms abzuspeichern.
Hier sollen ganze Klassen in ihren aktuellen Zustand gespeichert werden können.

Die Serialisierung funktioniert d.h. meine .dat datei wird erstellt und es wirft keinen fehler.

Bei der Deserialization wird jedoch ein Fehler geworfen aus dem ich nicht schlau werde:> Fehlermeldung:

Ein Aufrufziel hat einen Ausnahmefehler verursacht.

Könnt ihr mir Weiterhelfen?

MfG
kinamee


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;

namespace testMainScreen4editor
{
    [Serializable()]
    class Serialize : ISerializable
    {
        public Player player { get; set; }
        public Item[] haendlerItems { get; set; }

        public Serialize(SerializationInfo info, StreamingContext context)
        {
            player = ((Player)info.GetValue("player", typeof(Player)));
            haendlerItems = (Item[])info.GetValue("items", typeof(Item[]));
        }
        public Serialize(Player player, Item[] haendlerItems)
        {
            this.player = player;
            this.haendlerItems = haendlerItems;
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("player", player);
            info.AddValue("items", haendlerItems);
        }

        public void SaveToFile()
        {
            using (FileStream file = new FileStream(@"H:/mydata.dat", FileMode.Create))
            {
                BinaryFormatter binFor = new BinaryFormatter();
                binFor.Serialize(file, this);
                System.Windows.Forms.MessageBox.Show("Saved");
            }
        }

        public static Serialize LoadFromFile()
        {
            FileStream file = null;
            try
            {
                file = new FileStream(@"H:/mydata.dat", FileMode.Open);

                BinaryFormatter binFor = new BinaryFormatter();
                Serialize test = (Serialize)binFor.Deserialize(file);//Fehler hier!
                //Der Konstruktor wird nicht einmal aufgerufen
                return test;
            }
            catch(Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
                return null;
            }
        }
    }
}


K
89 Beiträge seit 2013
vor 8 Jahren

An welcher Stelle erscheint der Fehler?
Gibt es keine Details zum Fehler?

K
kinamee Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

Wo der Fehler auftritt habe ich im Quellcode mit einem Kommentar makiert.

In der Fehlermeldung steht folgendes:> Fehlermeldung:

Ein Ausnahmefehler des Typs "System.Reflection.TagentInvocationException" ist in
mscorelib.dll aufgetreten.

Zusätzliche Informationen: Ein Aufrufziel hat einen Ausnahmefehler verursacht.

R
228 Beiträge seit 2013
vor 8 Jahren

Um was für ein System handelt es sich? Ich finde es komisch, dass die Pfadangaben mit einem / gemacht werden. Für Windows ist \ üblich.

Die InnerException wäre auch noch interessant

K
kinamee Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

mit / oder \ zu arbeiten macht keinen unterschied ich benutze win 7
als Beweis erstellt es ja meine .dat datei was es nicht tun könnte wenn der Pfad nicht passen würde.

Fehlermeldung:
InnerException:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

K
89 Beiträge seit 2013
vor 8 Jahren

Hast du schon debuggt?
sieht irgendwie so aus als wäre binFor null

M
334 Beiträge seit 2007
vor 8 Jahren

Sind denn die Klassen Player und Item auch serialisierbar?

K
kinamee Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

nein... das ist leider nicht die Lösung.
nach der Initialisierung wechselt der wert von null auf System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

ja beide Klassen wurden wie meine Serialize Klasse serialisierbar gemacht.

K
kinamee Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

Villeicht hillft euch die Debuggingausgabe weiter:


"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "H:\programming\C#\c# projecte\Spiele\testMainScreen4editor\testMainScreen4editor\bin\Debug\testMainScreen4editor.vshost.exe" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.DataSetExtensions\v4.0_4.0.0.0__b77a5c561934e089\System.Data.DataSetExtensions.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.CSharp\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.CSharp.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Deployment\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Deployment.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_de_b77a5c561934e089\mscorlib.resources.dll" geladen. Das Modul wurde ohne Symbole erstellt.
Der Thread 0x1a64 hat mit Code 259 (0x103) geendet.
Der Thread 0x1f40 hat mit Code 259 (0x103) geendet.
Der Thread 0x124c hat mit Code 259 (0x103) geendet.
"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "H:\programming\C#\c# projecte\Spiele\testMainScreen4editor\testMainScreen4editor\bin\Debug\testMainScreen4editor.exe" geladen. Symbole wurden geladen.
Eine Ausnahme (erste Chance) des Typs "System.NullReferenceException" ist in testMainScreen4editor.exe aufgetreten.
Eine Ausnahme (erste Chance) des Typs "System.Reflection.TargetInvocationException" ist in mscorlib.dll aufgetreten.
Eine Ausnahme (erste Chance) des Typs "System.NullReferenceException" ist in testMainScreen4editor.exe aufgetreten.
Ein Ausnahmefehler des Typs "System.NullReferenceException" ist in testMainScreen4editor.exe aufgetreten.
Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

"testMainScreen4editor.vshost.exe" (CLR v4.0.30319: testMainScreen4editor.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
Das Programm "[5516] testMainScreen4editor.vshost.exe" wurde mit Code 0 (0x0) beendet.

5.657 Beiträge seit 2006
vor 8 Jahren

Hi kinamee,

kann es sein, daß der BinaryFormatter nur als öffentlich deklarierte Klassen unterstützt?

Christian

Weeks of programming can save you hours of planning

K
kinamee Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

Es sollte mit allen Klassen möglich sein, die von ISerializable erben

5.657 Beiträge seit 2006
vor 8 Jahren

Hast du es ausprobiert? Implementieren denn die Klassen Player und Item das Interface? Kannst du einzelne Instanzen dieser Klassen serialisieren und deserialisieren? Bist du dir sicher, daß der Konstruktor gar nicht erst aufgerufen wird, bzw. hast du mal einen Breakpoint in den Konstruktor gesetzt?

Christian

Weeks of programming can save you hours of planning

K
kinamee Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

Ja diese sachen habe ich bereits versucht
ich werde es nochmal in einem kleineren Projekt versuchen das nicht gerade 2500 zeilen oder so hat

5.657 Beiträge seit 2006
vor 8 Jahren

Magst du uns auch noch schreiben, was dabei herausgekommen ist? Kannst du die Unterklassen einzeln serialisieren oder nicht?

Christian

Weeks of programming can save you hours of planning

K
kinamee Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

Es liegt wohl wirklich an meinem anderen Projekt.
Hier ein kleines Testprojekt das einwandfrei funktioniert:

Windows Forms Anwendung mit einem Button:


private void button1_Click(object sender, EventArgs e)
        {
            Serialize s = new Serialize();
            MessageBox.Show(s.person.ToString());
            s.SaveToFile();

            Serialize snew = Serialize.LoadFromFile();
            MessageBox.Show(snew.person.ToString());
        }

und hier die Testklassen


namespace Serialisierungstest1
{
    [Serializable()]
    class Person : ISerializable
    {
        public Adresse adresse { get; set; }
        public String Name { get; set; }
        public int Alter { get; set; }

        public Person(SerializationInfo info, StreamingContext context)
        {
            Name = info.GetString("Name");
            Alter = info.GetInt32("Alter");
            adresse = (Adresse)info.GetValue("Adresse", typeof(Adresse));
        }

        public Person(String Name)
        {
            this.Name = Name;
            this.Alter = 10;
            this.adresse = new Adresse(84562);
        }

        public override string ToString()
        {
            return Name + "\n" + Alter + "\n" + adresse.ToString();
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Name", Name);
            info.AddValue("Alter", Alter);
            info.AddValue("Adresse", adresse);
        }
    }

    [Serializable()]
    class Adresse : ISerializable
    {
        public String Strasse { get; set; }
        public int Hausnummer { get; set; }
        public int PLZ { get; set; }
        public String Ort { get; set; }

        public override string ToString()
        {
            String s = "";
            s += Strasse + " " + Hausnummer + "\n" + PLZ + " " + Ort;
            return s;
        }

        public Adresse(int PLZ)
        {
            Strasse = "SuperStraße";
            Hausnummer = 69;
            this.PLZ = PLZ;
            Ort = "DieStadt";
        }

        public Adresse(SerializationInfo info, StreamingContext context)
        {
            Strasse = info.GetString("Strasse");
            Hausnummer = info.GetInt32("Hausnummer");
            PLZ = info.GetInt32("Plz");
            Ort = info.GetString("Ort");
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Strasse", Strasse);
            info.AddValue("Hausnummer", Hausnummer);
            info.AddValue("Plz", PLZ);
            info.AddValue("Ort", Ort);
        }
    }


    [Serializable()]
    class Serialize : ISerializable
    {
        public Person person { get; set; }

        public Serialize(SerializationInfo info, StreamingContext context)
        {
            person = (Person)info.GetValue("Person", typeof(Person));
        }
        public Serialize()
        {
            person = new Person("Hans");
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Person", person);
        }

        public void SaveToFile()
        {
            using (FileStream file = new FileStream(@"H:/mydata.dat", FileMode.Create))
            {
                BinaryFormatter binFor = new BinaryFormatter();
                binFor.Serialize(file, this);
                System.Windows.Forms.MessageBox.Show("Saved");
            }
        }

        public static Serialize LoadFromFile()
        {
            FileStream file = null;

                file = new FileStream(@"H:/mydata.dat", FileMode.Open);

                BinaryFormatter binFor = new BinaryFormatter();
                Serialize test = (Serialize)binFor.Deserialize(file);
                return test;

        }
    }
}

ich werde mir wohl mein anderes projekt von grundauf anschauen müssen.

Danke für Eure Hilfe!