我想在序列化時壓縮ProtoBuffer對象,並在反序列化時解壓縮。令人遺憾的是,C#stdlib只提供在流而不是byte []上工作的壓縮例程,這使得它比函數調用更冗長。我的代碼到目前爲止:處置MemoryStreams和GZipStreams
class MyObject{
public string P1 {get; set;}
public string P2 {get; set;}
// ...
public byte[] Serialize(){
var builder = new BinaryFormat.MyObject.Builder();
builder.SetP1(P1);
builder.SetP2(P2);
// ...
// object is now build, let's compress it.
var ms = new MemoryStream();
// Without this using, the serialisatoin/deserialisation Tests fail
using (var gz = new GZipStream(ms, CompressionMode.Compress))
{
builder.Build().WriteTo(gz);
}
return ms.ToArray();
}
public void Deserialize(byte[] data)
{
var ms = new MemoryStream();
// Here, Tests work, even when the "using" is left out, like this:
(new GZipStream(new MemoryStream(data), CompressionMode.Decompress)).CopyTo(ms);
var msg = BinaryFormat.MachineInfo.ParseFrom(ms.ToArray());
P1 = msg.P1;
P2 = msg.P2;
// ...
}
}
在處理流時,似乎必須手動處理對象的處理。我想知道這是爲什麼,我希望GZipStream被完全管理的代碼。我想知道如果反序列化只是偶然發生,以及我是否應該放棄MemoryStreams。
我知道我可以通過簡單地使用第三方壓縮庫來解決這個問題,但這個問題除了這個問題之外還有點不同。
如果我正確地記得'MemoryStream'是在它擁有對象的時候被拋棄的,在這種情況下''GZipStream'被處置。或者,這可能只是爲'Image's ... – TheLethalCoder
那麼把它當作學習曲線,如果某件事實現了'IDisposable',它應該被丟棄,理想情況下使用'using'。編寫正確使用和處理對象的代碼,你首先不會看到這個問題。 – TheLethalCoder
@TheLethalCoder [並不總是](https://blogs.msdn.microsoft.com/pfxteam/2012/03/25/do-i-need-to-dispose-of-tasks/),以「任務」爲例,它是IDisposeable,但它的功能頁面[你不需要這樣做](https://msdn.microsoft.com/en-us/library/dd270681(v = vs.110).aspx#Anchor_2 )當面向.NET 4.5或更高版本時。 –