Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Serialization BinaryFormatter problem beim Laden
kinamee
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

Serialization BinaryFormatter problem beim Laden

beantworten | zitieren | melden

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:
Fehler
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;
            }
        }
    }
}

private Nachricht | Beiträge des Benutzers
kunsti
myCSharp.de - Member



Dabei seit:
Beiträge: 89

beantworten | zitieren | melden

An welcher Stelle erscheint der Fehler?
Gibt es keine Details zum Fehler?
private Nachricht | Beiträge des Benutzers
kinamee
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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

In der Fehlermeldung steht folgendes:
Fehler
Ein Ausnahmefehler des Typs "System.Reflection.TagentInvocationException" ist in
mscorelib.dll aufgetreten.

Zusätzliche Informationen: Ein Aufrufziel hat einen Ausnahmefehler verursacht.
private Nachricht | Beiträge des Benutzers
Rioma
myCSharp.de - Member



Dabei seit:
Beiträge: 228

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Rioma am .
private Nachricht | Beiträge des Benutzers
kinamee
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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.
Fehler
InnerException:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
private Nachricht | Beiträge des Benutzers
kunsti
myCSharp.de - Member



Dabei seit:
Beiträge: 89

beantworten | zitieren | melden

Hast du schon debuggt?
sieht irgendwie so aus als wäre binFor null
private Nachricht | Beiträge des Benutzers
mabo
myCSharp.de - Member



Dabei seit:
Beiträge: 334

beantworten | zitieren | melden

Sind denn die Klassen Player und Item auch serialisierbar?
private Nachricht | Beiträge des Benutzers
kinamee
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
kinamee
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kinamee
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

Es sollte mit allen Klassen möglich sein, die von ISerializable erben
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kinamee
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

Ja diese sachen habe ich bereits versucht
ich werde es nochmal in einem kleineren Projekt versuchen das nicht gerade 2500 zeilen oder so hat
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von kinamee am .
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kinamee
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers