私は WPF をシリアル化して圧縮しようとしています .NETクラスFlowDocument
を使用して、バイト配列を解凍し、逆シリアル化して FlowDocument を再作成します。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 バイトが含まれていないのはなぜですか?
(「圧縮された」バイト配列が「圧縮されていない」バイト配列よりも大きいという事実を無視してください。通常は、はるかに大きなフロー ドキュメントで作業します)