using System; using System.IO; using System.IO.Compression; using System.Runtime.Serialization.Formatters.Binary; namespace WWPipeLine.Commons.SerializeHelper { /// /// 二进制序列化和反序列化 /// /// public class BinaryFormatterHelper { private BinaryFormatterHelper() { } #region 序列化 /// /// 序列化 /// /// /// public static Byte[] Serialize(T obj) where T : class { try { //创建内存流 MemoryStream ms = new MemoryStream(); //产生二进制序列化格式 BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, obj); ms.Position = 0; byte[] buffers = ms.ToArray(); //清空和释放内存流 ms.Close(); ms.Dispose(); return Compress(buffers); } catch { return new byte[] { }; } } /// /// 压缩数据 /// /// /// public static byte[] Compress(byte[] buffer) { if (buffer == null || buffer.Length == 0) { return buffer; } //创建内存流 MemoryStream ms = new MemoryStream(); //压缩和解压缩流 GZipStream gzip = new GZipStream(ms, CompressionMode.Compress, true); gzip.Write(buffer, 0, buffer.Length); //清空和释放压缩和解压缩流 gzip.Close(); gzip.Dispose(); ms.Position = 0; byte[] returnBuffer = new byte[ms.Length]; ms.Read(returnBuffer, 0, int.Parse(ms.Length.ToString())); //清空和释放内存流 ms.Close(); ms.Dispose(); return returnBuffer; } #endregion 序列化 #region 反序列化 /// /// 反序列化 /// /// /// public static T Deserilize(byte[] buffer) where T : class { try { byte[] debuffer = Decompress(buffer); //产生二进制序列化格式 BinaryFormatter bf = new BinaryFormatter(); //创建内存流 MemoryStream ms = new MemoryStream(debuffer); ms.Position = 0; T obj = bf.Deserialize(ms) as T; //清空和释放内存流 ms.Close(); ms.Dispose(); return obj; } catch { return null; } } /// /// 解压缩流 /// /// /// public static byte[] Decompress(byte[] buffer) { if (buffer == null || buffer.Length == 0) { return buffer; } try { //创建内存流 MemoryStream ms = new MemoryStream(buffer); ms.Position = 0; //压缩和解压缩流 GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress); byte[] rebuffer = new byte[1024]; //创建内存流 MemoryStream msre = new MemoryStream(); while (true) { int readcount = gzip.Read(rebuffer, 0, rebuffer.Length); if (readcount > 0) msre.Write(rebuffer, 0, readcount); else break; } msre.Close(); byte[] buffers = msre.ToArray(); msre.Dispose(); //清空和释放压缩和解压缩流 gzip.Close(); gzip.Dispose(); //清空和释放内存流 ms.Close(); ms.Dispose(); return buffers; } catch { return new byte[] { }; } } #endregion 反序列化 } }