【发布时间】:2012-08-11 14:41:00
【问题描述】:
我正在尝试序列化和压缩 WPF FlowDocument,然后执行相反的操作 - 解压缩字节数组并反序列化以重新创建 FlowDocument - 使用 .NET GZipStream 类。我正在遵循 MSDN 上描述的示例,并且我有以下测试程序:
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 个字节?
(请忽略“压缩”字节数组大于“未压缩”字节数组的事实——我通常会处理更大的流文档)
【问题讨论】:
-
虽然您可以解决这个问题,但您应该首先考虑是否要使用该类。在这里查看我的 cmets:stackoverflow.com/questions/11435200/…
标签: c# .net wpf compression gzipstream