2011-09-02 51 views
1

首先,我注意到壓縮對象需要更多的字節,然後純粹以二進制形式表示對象。 (228比166)。另一個DeflateStream解壓縮問題(使用使用和內存流)

其次,我似乎無法解壓縮它。

此外,我不能使用很好的CopyTo功能,因爲我沒有.NET框架的第4版。

什麼需要去在最後的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); 
} 

回答

3

沒有保證緊縮將總是導致一個更小的尺寸(儘管它應該只使用一個「存儲/生/ undeflated」在這種情況下部分)。

對小的和/或已經壓縮的數據進行編碼時,.NET deflate實現(它也用於GZipStream中)爲known to be particular bad(儘管符合)。有第三方庫,包括DotNetZip,可以解決.NET BCL中存在的這兩個問題。

當我壓縮壓縮(在小塊數據上)時,我有一個「放氣」的標誌,所以我存儲的流只是有時會放氣,這取決於deflate是否「值得」。

快樂編碼。

+0

謝謝。 +1解決問題1.我認爲它可能有一些事情要做的事情/被壓縮的數據的小。不幸的是,解壓縮步驟仍然不起作用。 – user420667

0

可以初始化已經這樣字節的MemoryStream(不需要寫&位置):

裏面的代碼是什麼呢CopyTo從在.NET 4.0中

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(); 
} 

我得到這個代碼是有原因的(注意處置)我相信,我記得當我試圖通過using output來處理它時,它不起作用,而是肯定會看起來更酷。

+0

我試過這個,但它抱怨輸出是空的。我注意到它正在跳過while循環,彷彿ds.Read(...)沒有做任何事情。我試過你的代碼,我的舊解壓縮代碼是,除了我不得不將你的ms重命名爲tmpms。無論如何,它仍然無法正常工作。有什麼建議麼? – user420667