/// <summary> /// 写压缩文件 串行化 /// </summary> /// <param name="piaFile">被反序列化解压的压缩文件信息</param> /// <param name="stream">流文件</param> /// <param name="IsPlotOrTxt">true保存为打印,false保存为txt</param> public static void Serialize(this PiaFile piaFile, Stream stream, bool IsPlotOrTxt = true) { if (piaFile == null) { throw new ArgumentNullException("PiaFile"); } if (stream == null) { throw new ArgumentNullException("Stream"); } if (IsPlotOrTxt) { //头信息 var headerString = piaFile.Header.ToString(); var headerBytes = Encoding.Default.GetBytes(headerString); stream.Write(headerBytes, 0, headerBytes.Length);//写入 } //节点 var nodeString = piaFile.SerializeNode(); var nodeBytes = Encoding.Default.GetBytes(nodeString); if (IsPlotOrTxt) { //压缩节点 byte[] deflatedBytes; var deflater = new Deflater(Deflater.DEFAULT_COMPRESSION); //默认压缩系数 using (var ms = new MemoryStream()) //内存流 { var deflateStream = new DeflaterOutputStream(ms, deflater); //压缩流生成 deflateStream.Write(nodeBytes, 0, nodeBytes.Length); deflateStream.Finish(); deflatedBytes = ms.ToArray(); } //校验和 var checkSum = new byte[12]; BitConverter.GetBytes(deflater.Adler).CopyTo(checkSum, 0); // Adler BitConverter.GetBytes(nodeBytes.Length).CopyTo(checkSum, 4); // 压缩前字节数 BitConverter.GetBytes(deflatedBytes.Length).CopyTo(checkSum, 8); // 压缩后字节数 stream.Write(checkSum, 0, checkSum.Length); //写入 // 最终写入 stream.Write(deflatedBytes, 0, deflatedBytes.Length); } else { stream.Write(nodeBytes, 0, nodeBytes.Length);//写出txt测试 } stream.Write(Encoding.Default.GetBytes("\0"), 0, 1); }
/// <summary> /// 反序列化解压 /// </summary> /// <param name="stream"></param> /// <param name="piaFile"></param> public static void Deserialize(this PiaFile piaFile, Stream stream) { if (stream == null) { throw new ArgumentNullException("Stream"); } if (piaFile == null) { throw new ArgumentNullException("PiaFile"); } try { //头信息 var headerBytes = new byte[48]; // Ignore 12 byte checksum 有12个是校验信息,所以不解压 stream.Read(headerBytes, 0, headerBytes.Length); //二进制读取这些信息 var headerString = Encoding.Default.GetString(headerBytes); piaFile.Header = new PiaHeader(headerString); //头信息写到这里干什么?? //解压 stream.Seek(60, SeekOrigin.Begin); //从60字节位置开始解压 string inflatedString; using (var zStream = new InflaterInputStream(stream)) //压缩流 { var sr = new StreamReader(zStream, Encoding.Default); //自动编码读取压缩流 inflatedString = sr.ReadToEnd(); //读到最后 } //拥有者 piaFile.Owner = piaFile; PiaFile = piaFile; DeserializeNode(piaFile, inflatedString); } catch (Exception) { throw; } }