我試圖序列化和壓縮一個WPF FlowDocument
,然後做相反的事情 - 解壓字節數組並反序列化以重新創建FlowDocument - 使用.NET類GZipStream
。我以下MSDN上所描述的示例和我有以下的測試程序:.NET GZipStream解壓縮生成空流
var flowDocumentIn = new FlowDocument();
flowDocumentIn.Blocks.Add(new Paragraph(new Run("Hello")));
Debug.WriteLine("Compress");
byte[] compressedData;
using (var uncompressed = new MemoryStream())
{
XamlWriter.Save(flowDocumentIn, uncompressed);
uncompressed.Position = 0;
using (var compressed = new MemoryStream())
using (var compressor = new GZipStream(compressed, CompressionMode.Compress))
{
Debug.WriteLine(" uncompressed.Length: " + uncompressed.Length);
uncompressed.CopyTo(compressor);
Debug.WriteLine(" compressed.Length: " + compressed.Length);
compressedData = compressed.ToArray();
}
}
Debug.WriteLine("Decompress");
FlowDocument flowDocumentOut;
using (var compressed = new MemoryStream(compressedData))
using (var uncompressed = new MemoryStream())
using (var decompressor = new GZipStream(compressed, CompressionMode.Decompress))
{
Debug.WriteLine(" compressed.Length: " + compressed.Length);
decompressor.CopyTo(uncompressed);
Debug.WriteLine(" uncompressed.Length: " + uncompressed.Length);
flowDocumentOut = (FlowDocument) XamlReader.Load(uncompressed);
}
Assert.AreEqual(flowDocumentIn, flowDocumentOut);
但是我在XamlReader.Load
線這是正常的,因爲調試輸出告知未壓縮流具有零長度得到一個異常。
Compress
uncompressed.Length: 123
compressed.Length: 202
Decompress
compressed.Length: 202
uncompressed.Length: 0
爲什麼最終的uncompressed
流包含原始的123字節?
(請忽略的事實是,「壓縮」字節數組是比「未壓縮的」字節數組大 - 我通常會用更大的流文件的工作)
雖然你可能解決這個問題,你應該考慮是否要使用這個類的第一名。在這裏看到我的意見:http://stackoverflow.com/questions/11435200/why-does-my-c-sharp-gzip-produce-a-larger-file-than-fiddler-or-php – 2012-08-11 20:03:42