metax Member
Anmeldedatum: 13.02.2009 Beiträge: 299
|
Verfasst 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 |
|

|
SeeQuark Member
Anmeldedatum: 22.02.2009 Beiträge: 129 Wohnort: CH
|
Verfasst 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 |
|

|
Kevin Member
Anmeldedatum: 24.10.2008 Beiträge: 882 Wohnort: Karlsruhe
|
Verfasst 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 |
|

|
metax Member
Anmeldedatum: 13.02.2009 Beiträge: 299
|
Verfasst 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...  _________________ Blog: http://metax.kilu.de/
Monopolize: http://monopolize-game.blogspot.com/ |
|
| Nach oben |
|

|
SeeQuark Member
Anmeldedatum: 22.02.2009 Beiträge: 129 Wohnort: CH
|
Verfasst 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 |
|

|
metax Member
Anmeldedatum: 13.02.2009 Beiträge: 299
|
|
| Nach oben |
|

|
pdelvo Member
Anmeldedatum: 21.02.2009 Beiträge: 231
|
Verfasst 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 |
|

|
SeeQuark Member
Anmeldedatum: 22.02.2009 Beiträge: 129 Wohnort: CH
|
Verfasst 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 |
|

|
metax Member
Anmeldedatum: 13.02.2009 Beiträge: 299
|
Verfasst 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 |
|

|
|