我试图序列化和压缩一个
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
为什么最终的未压缩流不包含原始的123个字节?
(请忽略“压缩”字节数组大于“未压缩”字节数组的事实 – 我通常会使用更大的流程文档)
解决方法
在从内存流获取压缩字节之前,需要关闭GZipStream.在这种情况下,由于使用所调用的dispose处理关闭.
using (var compressed = new MemoryStream()) { using (var compressor = new GZipStream(compressed,CompressionMode.Compress)) { uncompressed.copyTo(compressor); } // Get the compressed bytes only after closing the GZipStream compressedBytes = compressed.ToArray(); }
这可以工作,甚至可以删除MemoryStream的使用,因为它将由GZipStream处理,除非您使用构造函数重载,允许您指定底层流应该保持打开状态.这意味着与代码一样,您调用ToArray处理的流,但这是允许的,因为这些字节仍然可用,这使得处理内存流有点奇怪,但如果你不这样做,FXcop会让你烦恼.
原文地址:https://www.jb51.cc/csharp/96515.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。