Inheritance: PiaNode
Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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;
            }
        }