2

まず、オブジェクトを圧縮するには、オブジェクトを純粋にバイナリ形式で表現するよりも多くのバイトが必要であることに気付きました。(228 対 166)。

第二に、私はそれを解凍できないようです。

また、バージョン 4 の .NET フレームワークを持っていないため、便利な CopyTo 機能を使用できません。

ブロックを使用して最後の DeflateStream に何を入れる必要がありますか?

MyClass MyObj = new MyClass();
MyObj.MyProp1 = true;
MyObj.MyProp2 = "Dee";
MyClass MyObAfterSerDeser = null;
using (MemoryStream ms = new MemoryStream())
{
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(ms, MyObj);
    byte[] prebytes = ms.ToArray(); // length 166.
    ms.SetLength(0L); 
    using(MemoryStream tmpms = new MemoryStream())
    {
        using (DeflateStream dsc = new DeflateStream(tmpms, CompressionMode.Compress))
        {
            dsc.Write(prebytes, 0, prebytes.Length);
            tmpms.WriteTo(ms); // unforunately though, just want the # of compressed bytes.
        }
    }
    byte[] cbytes = ms.ToArray();  // length 228.  Longer than uncompressed version!
    ms.SetLength(0L);

    using (MemoryStream tmpms = new MemoryStream())
    {
        tmpms.Write(cbytes, 0, cbytes.Length);
        tmpms.Position = 0;
        using (DeflateStream dsd = new DeflateStream(tmpms, CompressionMode.Decompress))
        {
            byte[] dbytes = new byte[cbytes.Length];
            dsd.Read(dbytes, 0, dbytes.Length);
            int offset = ReadAllBytesFromStream(dsd, dbytes);  // written by Mr. Skeet.
            // dsd.Write(dbytes, 0, cbytes.Length);
            // dsd.Read(dbytes, 0, dbytes.Length);
            ms.Write(dbytes, 0, offset);
        }
    }
    MyObAfterSerDeser = (MyClass)bf.Deserialize(ms);
}
4

2 に答える 2

3

deflate が常に小さいサイズになるという保証はありません(ただし、そのような場合は「格納された/生/収縮されていない」セクションを使用する必要があります)

.NET デフレートの実装 (GZipStream でも使用されます) は、小さいデータや既に圧縮されているデータをエンコードする場合に、(適合しているとはいえ)特に悪いことが知られています。.NET BCL に存在するこれら 2 つの問題を修正する、DotNetZip などのサード パーティ ライブラリがあります。

(小さなデータに対して) deflate 圧縮を行う場合、「deflated」フラグがあるため、保存するストリームは、deflate が「価値がある」かどうかに応じて、時々しか収縮しません。

ハッピーコーディング。

于 2011-09-02T00:48:25.303 に答える
0

次のようなバイトでメモリストリームを初期化できます(書き込みと配置は必要ありません):

内部のコードは、.NET 4.0 で CopyTo が行うことです

MemoryStream output = new MemoryStream();
try
{
   using (MemoryStream ms = new MemoryStream(cbytes))
   using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Decompress, true)) {

    int num;
    byte[] buffer = new byte[100];
    while ((num = ds.Read(buffer, 0, buffer.Length)) != 0)
    {
        output.Write(buffer, 0, num);
    }
   }
   MyObAfterSerDeser = (MyClass)bf.Deserialize(output);
}
finally
{
    output.Dispose();
}

私はこのコードを何らかの理由で取得しました (dispose に注意してusing outputください)。

于 2011-09-02T00:52:28.433 に答える