Load-Datei Nicht funktioniert - Die Magische Zahl im GZip-header ist nicht korrekt
Ich bin versucht, erstellen Sie eine Speichern/Laden-Klasse, die die option für das speichern & load-Dateien komprimierte Dateien. Unten ist das, was ich habe, so weit. Durchlaufen es scheint zu funktionieren gut, außer dass ich eine "Magische Zahl im GZip-header ist nicht korrekt" Ausnahme. Ich verstehe nicht wie das sein kann, wie ich bin, überprüfung, um sicherzustellen, dass die Zahl es, bevor ich es übergeben, und ich habe überprüft, die über ein externes Programm, es ist eine GZip-Datei.
Jede Hilfe, herauszufinden, wo ich schief ging, würde geschätzt werden. Konstruktive Kritik an meinem code ist immer willkommen - Danke!
public static class SaveLoad
{
public static void Save(string fileName, object savefrom, bool compress)
{
FileStream stream = new FileStream(fileName, FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
if (compress)
{
GZipStream compressor = new GZipStream(stream, CompressionMode.Compress);
formatter.Serialize(compressor, savefrom);
compressor.Close();
}
else { formatter.Serialize(stream, savefrom); }
stream.Close();
}
public static object Load(string fileName)
{
object loadedObject = null;
try
{
FileStream stream = new FileStream(fileName, FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
if (stream.Length > 4)
{
byte[] data = new byte[4];
stream.Read(data, 0, 4);
if (BitConverter.ToUInt16(data, 0) == 0x8b1f) //GZIP_LEAD_BYTES == 0x8b1f
{
GZipStream decompressor = new GZipStream(stream, CompressionMode.Decompress);
loadedObject = formatter.Deserialize(decompressor); //Exception
decompressor.Close();
}
else { loadedObject = formatter.Deserialize(stream); }
}
stream.Close();
}
catch (Exception e)
{
Logger.StaticLog.AddEvent(new Logger.lEvent(null, Logger.lEvent.EventTypes.Warning, "Failed to load file: " + fileName, e)
{
SendingObject = "SaveLoad"
});
Logger.StaticLog.WriteLog();
throw;
}
return loadedObject;
}
}
Wahrscheinlich würde Sie suchen müssen, wieder in die position 0 zu ermöglichen GZipStream zu Lesen die ersten 4 bytes, die Sie bereits gelesen zu haben.
werfen Sie einen Blick auf meine Antwort
werfen Sie einen Blick auf meine Antwort
InformationsquelleAutor Anthony Nichols | 2013-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es, dass Sie die Magische Zahl vor der übergabe den stream decompressor (was nicht gelesen wird, die Magische Zahl, denn Sie habe auch schon gelesen).
Verwenden
stream.Seek(0,SeekOrigin.Begin)
bevor Sie Dekomprimieren.InformationsquelleAutor Anton Kovalenko