DeflateStream funktioniert nicht auf MemoryStream?
Habe ich das folgende Stück code:
MemoryStream resultStream = new MemoryStream();
string users = ""//Really long string goes here
BinaryFormatter bFormatter = new BinaryFormatter();
using (MemoryStream assignedUsersStream = new MemoryStream())
{
bFormatter.Serialize(assignedUsersStream, users);
assignedUsersStream.Position = 0;
using (var compressionStream =
new DeflateStream(resultStream, CompressionLevel.Optimal))
{
assignedUsersStream.CopyTo(compressionStream);
Console.WriteLine("Compressed from {0} to {1} bytes.",
assignedUsersStream.Length.ToString(),
resultStream.Length.ToString());
}
}
die Sache ist, dass resultStream
ist immer leer!!!
Was mache ich hier falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Legen Sie Ihre Prüfung WriteLine außerhalb des mit. Die Puffer nicht geleert wurde noch.
Abgesehen, Sie brauchen nicht all diese
ToString()
s in einer writeline.PS: Allen ein BinaryFormatter ein string ist, schreiben die bytes mit der Länge Präfix. Wenn Sie nicht brauchen das Präfix (meine Vermutung), könnte es werden:
Umgekehrt ist genau so einfach, aber Sie benötigen eine Schätzung für die maximale Länge zu schaffen, das die lese-Puffer:
Encoding.GetBytes()
.Das ist, weil die
DeflateStream
nicht bündig die Daten zu den zugrunde liegenden stream, bis es geschlossen ist. Nachdem es geschlossen wurde,resultStream
enthalten die komprimierten Daten. Beachten Sie, dass standardmäßigDeflateStream
schließt den zugrunde liegenden stream, wenn es geschlossen ist, aber das wollen Sie nicht, so dass Sie brauchen, um passierentrue
für dieleaveOpen
parameter. Auch, Sie brauchen keine 2-Speicher-streams, können Sie einfach serialisieren direkt auf diecompressionStream
:Aus der ursprünglichen Antwort (ich habe nicht genug Guthaben zum abstimmen unten)
Diese ist unvollständig und irreführend. DeflateStream schließt die zugrunde liegende resultStream einmal DeflateStream geht out of scope. Daher resultStream.Länge wirft
Thomas Levesque ist richtig => auch
leaveOpen
zu wahren.Eine interessante Frage, mit der einige gute Punkte angesprochen, die von HH und TL.