recently I needed to compress a binary stream that was getting to big to be serialized over internet. I could not find any way to compress files easily, so eventually I used a 3rd party library that works very well in Unity3D (web player included): SharpZipLib
I suppose the following code could be handy for someone:
using ICSharpCode.SharpZipLib.BZip2; using System.Runtime.Serialization.Formatters.Binary; using System.IO; static void Compress (string nameOfTheFileToSave, ISerializable objectToSerialize) { using (FileStream fs = new FileStream(nameOfTheFileToSave, FileMode.Create)) { using (MemoryStream objectSerialization = new MemoryStream()) { BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(objectSerialization, objectToSerialize); using (BinaryWriter binaryWriter = new BinaryWriter(fs)) { binaryWriter.Write(objectSerialization.GetBuffer().Length); //write the length first using (BZip2OutputStream osBZip2 = new BZip2OutputStream(fs)) { osBZip2.Write(objectSerialization.GetBuffer(), 0, objectSerialization.GetBuffer().Length); //write the compressed file } } } } } static void Decompress(string nameOfTheFileToLoad) { using (FileStream fs = new FileStream(nameOfTheFileToLoad, FileMode.Open)) { using (BinaryReader binaryReader = new BinaryReader(fs)) { int length = binaryReader.ReadInt32(); //read the length first byte[] bytesUncompressed = new byte[length]; //you can convert this back to the object using a MemoryStream ;) using (BZip2InputStream osBZip2 = new BZip2InputStream(fs)) { osBZip2.Read(bytesUncompressed, 0, length); //read the decompressed file } } } }
Nice! this helped us a lot.