ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Backslider)
Kommentare (0)
****

Weitere
User onlineBenutzer online
Gäste online: 9
Mitglieder online: Keine
Registrierte Mitglieder: 2116
Neustes Mitglied: onkel_keks

Serialisierung

Neue Antwort erstellen
 

 

Autor Nachricht
 
 
metax
Member


Anmeldedatum: 13.02.2009
Beiträge: 299

Antworten mit Zitat
BeitragVerfasst am: 25.05.2009, 18:16    Titel: Serialisierung

Ein gutes Tutorial über Serialisierung gibt es ja schon, aber ich habe mal eine kleine Klasse dafür geschrieben. Vielleicht nutzt es ja jemandem.



Code:
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace Serialization
{
    static class Serializer
    {
        public static void SaveObject(string path, object serializableObject)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream(path, FileMode.Create);

            formatter.Serialize(stream, serializableObject);

            stream.Close();
            stream.Dispose();
        }

        public static object LoadObject(string path)
        {
            object serializableObject;
            BinaryFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream(path, FileMode.Open);

            serializableObject = formatter.Deserialize(stream);
            if (serializableObject == null)
            {
                throw new Exception("File could not be read.");
            }

            stream.Close();
            stream.Dispose();

            return serializableObject;
        }
    }
}

_________________
Blog: http://metax.kilu.de/

Monopolize: http://monopolize-game.blogspot.com/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


SeeQuark
Member


Anmeldedatum: 22.02.2009
Beiträge: 129
Wohnort: CH

Antworten mit Zitat
BeitragVerfasst am: 25.05.2009, 19:14    Titel:

Schick, auch wenn ich die Daten praktisch nur mit XML speichere (oft in Verbindung mit zip)^^

Vielleicht noch zu deinem Code:
metax hat Folgendes geschrieben:
Code:
            stream.Close();
            stream.Dispose();

Die beiden Methoden bewirken genau das gleiche. Ich würde also nur Close verwenden. Noch besser wäre allerdings ein using. Das ist imho viel übersichtlicher.

Ausserdem könnte man darüber nachdenken, die Methoden generisch zu machen. Also etwa
Code:
public static T Load<T>(string path)
{
    ...
    T? serializableObject = formatter.Deserialize(stream) as T?;
    if (!serializableObject.HasValue) ...
    return serializableObject.Value;
}

(Code im Antwortfenster zusammengestellt)

Das gleiche mit Save, aber da geht es dann nur noch um Schönheit


mfg
SeeQuark
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Kevin
Member


Anmeldedatum: 24.10.2008
Beiträge: 882
Wohnort: Karlsruhe

Antworten mit Zitat
BeitragVerfasst am: 25.05.2009, 19:19    Titel:

Jo ganz nett.
Zitat:

metax hat Folgendes geschrieben:
Code:

            stream.Close();
            stream.Dispose(); 



Die beiden Methoden bewirken genau das gleiche


Bist du dir sicher, dass die das gleiche bewirken, macht Dispose nicht noch irgendwas mit dem GC?

MfG
Kevin
_________________
Mein Youtube Kanal
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


metax
Member


Anmeldedatum: 13.02.2009
Beiträge: 299

Antworten mit Zitat
BeitragVerfasst am: 25.05.2009, 19:25    Titel:

Ich hab mal sicherheitshalber beides verwendet, denn

Ysas hat Folgendes geschrieben:
malignate hat Folgendes geschrieben:
Stream Close kannst du dir mit Dispose auch sparen, Close ruft eh nur Dispose auf.


Vorsicht!

Close ruft Dispose auf das stimmt. Genauergesagt ruft der Dispose(true) auf

Das Close kann man sich nicht sparen da einige Ableitungen von Stream mehr machen als nur Dispose(true)!
und ein Dispose alleine reicht einfach nicht aus.

Ein Close alleine auch nicht immer da es ja immer noch Exceptions geben kann und wenn man dann im catch landet hat das Objekt einen undefinierten Zustand...


und daher war ich mir nicht sicher... Very Happy
_________________
Blog: http://metax.kilu.de/

Monopolize: http://monopolize-game.blogspot.com/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


SeeQuark
Member


Anmeldedatum: 22.02.2009
Beiträge: 129
Wohnort: CH

Antworten mit Zitat
BeitragVerfasst am: 25.05.2009, 19:30    Titel:

Schon klar, aber schau dir mal die Implementierung von Dispose an:
Code:
// aus dem Reflector kopiert
public void Dispose()
{
    this.Close();
}

Das kommt aus der Klasse Stream. Und es ist nicht einmal virtual. Dafür ist Close da.
Ysas hat Folgendes geschrieben:
und ein Dispose alleine reicht einfach nicht aus.

Das sollte sich damit erledigen.

Ein using reicht also völlig aus.

mfg
SeeQuark
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


metax
Member


Anmeldedatum: 13.02.2009
Beiträge: 299

Antworten mit Zitat
BeitragVerfasst am: 25.05.2009, 19:55    Titel:

OK
Habe auch nur deshalb kein Using verwendet, weil ich mir nicht sicher war, ob man Close() und Dispose() aufrufen muss...
_________________
Blog: http://metax.kilu.de/

Monopolize: http://monopolize-game.blogspot.com/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


pdelvo
Member


Anmeldedatum: 21.02.2009
Beiträge: 231

Antworten mit Zitat
BeitragVerfasst am: 25.05.2009, 20:03    Titel:

Dispose ist ja imho nur implementiert, damit man es in einem using benutzen kann. Es leitet nähmlich von IDisposable ab.

Gruß pdelvo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


SeeQuark
Member


Anmeldedatum: 22.02.2009
Beiträge: 129
Wohnort: CH

Antworten mit Zitat
BeitragVerfasst am: 25.05.2009, 20:09    Titel:

pdelvo hat Folgendes geschrieben:
Dispose ist ja imho nur implementiert, damit man es in einem using benutzen kann. Es leitet nähmlich von IDisposable ab.

Das finde ich ja so komisch... Man könnte diese Methode ja auch verstecken (als IDisposable.Dispose benennen), wie es andere Klassen machen. Und Dispose(bool disposing) öffentlich zu machen finde ich auch komisch. Imho gehört das protected.


Ysas hat Folgendes geschrieben:

Ein Close alleine auch nicht immer da es ja immer noch Exceptions geben kann und wenn man dann im catch landet hat das Objekt einen undefinierten Zustand...

Das ist an deinem Code noch schlecht: wenn die Exception geworfen wird, wird Dispose nicht ausgeführt.
Das lässt sich mit using verhindern.

mfg
SeeQuark
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


metax
Member


Anmeldedatum: 13.02.2009
Beiträge: 299

Antworten mit Zitat
BeitragVerfasst am: 25.05.2009, 20:51    Titel:

Also hier unter Beherzigung (hoffetlich) aller Einwände, die "Neuauflage":


Code:
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace Serialization
{
    static class Serializer
    {
        public static void Save<T>(string path, T serializableObject)
        {
            BinaryFormatter formatter = new BinaryFormatter();

            using (Stream stream = new FileStream(path, FileMode.Create))
            {
                formatter.Serialize(stream, serializableObject);
            }
        }

        public static T Load<T>(string path)
        {
            object serializableObject;
            BinaryFormatter formatter = new BinaryFormatter();

            using (Stream stream = new FileStream(path, FileMode.Open))
            {
                serializableObject = formatter.Deserialize(stream);
            }

            if (serializableObject == null)
            {
                throw new Exception("File could not be read.");
            }

            return (T)serializableObject;
        }
    }
}

_________________
Blog: http://metax.kilu.de/

Monopolize: http://monopolize-game.blogspot.com/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Beiträge der letzten Zeit anzeigen:   
 
Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de