首先,我注意到压缩对象需要更多的字节,然后纯粹以二进制形式表示对象。 (228 vs 166)。
其次,我似乎无法解压缩它。
另外,我不能使用漂亮的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);
}
答案 0 :(得分:3)
无法保证deflate将始终导致较小的(尽管在这种情况下 只需使用“存储/原始/未充气”部分)。
在编码小型和/或已压缩数据时,.NET deflate实现(也在GZipStream中使用)是known to be particular bad(尽管符合要求)。有第三方库,包括DotNetZip,可以纠正.NET BCL中存在的这两个问题。
当我进行压缩(对小块数据)时,我有一个“放气”标志,所以我存储的流有时只会放气,这取决于放气是否“值得”。
快乐的编码。
答案 1 :(得分:0)
你可以用这样的字节初始化内存流(不需要写和位置):
Code里面是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
处理它而不是肯定会看起来更冷时它不起作用。