1

Web サービスの応答のサイズを小さくするために、文字列を圧縮する必要があります。SharpZipLib サンプルに単体テストが表示されますが、正確に必要なものの例ではありません。

次のコードでは、ZipOutputStream のコンストラクターが例外を返します:「開いているエントリはありません」

        byte[] buffer = Encoding.UTF8.GetBytes(SomeLargeString);
        Debug.WriteLine(string.Format("Original byes of string: {0}", buffer.Length));

        MemoryStream ms = new MemoryStream();
        using (ZipOutputStream zipStream = new ZipOutputStream(ms))
        {
            zipStream.Write(buffer, 0, buffer.Length);
            Debug.WriteLine(string.Format("Compressed byes: {0}", ms.Length));
        }

        ms.Position = 0;
        MemoryStream outStream = new MemoryStream();

        byte[] compressed = new byte[ms.Length];
        ms.Read(compressed, 0, compressed.Length);

        byte[] gzBuffer = new byte[compressed.Length + 4];
        System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
        System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
        string compressedString = Convert.ToBase64String (gzBuffer);

どこで軌道から外れましたか?これを必要以上に複雑にしていますか?

4

5 に答える 5

3

Base 64 に変換した後、データはそれほど小さくなりますか? これにより、バイナリ データ (zip) が大幅に肥大化します。HTTP 圧縮を使用して、トランスポート レベルで問題を解決できませんか?

これは、往復の zip/unzip を行う方法を示す完全なソースを含む投稿です。

http://paultechguy.blogspot.com/2008/09/zip-xml-in-memory-for-web-service.html

于 2012-03-22T21:06:57.330 に答える
2

コードに関するいくつかの問題:

  1. ストリームを操作するときは、常にデータをフラッシュしてください。

  2. MemoryStream からデータを読み取るには、次を使用します。

    byte[] データ = ms.ToArray();

  3. Zip ファイルは、複数のエントリ (ファイル) やコメントを含むコンテナです。データの書き込みを開始する前に、PutNextEntry() を呼び出して新しいエントリを追加する必要がある場合があります。

  4. 単一のデータストリームのみを圧縮する必要がある場合 (これはあなたの場合です)、最良の選択は、単一のデータストリームを圧縮することを意図した deflate (または gzip) 圧縮を使用することです (実際には、zip 形式は gzip を内部的に使用して圧縮します)。そのエントリ...) .Net は、データ圧縮のための 2 つの非常に便利なクラスを提供します: GZipStream と DeflateStream です。良いサンプルはここにあります

于 2012-03-22T21:23:17.980 に答える
1

データを書き込む前に、PutNextEntry を呼び出してヘッダーを追加する必要があります。

回答のコピー元: http://community.sharpdevelop.net/forums/p/5910/16947.aspx

于 2012-03-22T21:06:56.580 に答える