Re: сжатие строк gzip'om
От: Mr Muskul  
Дата: 13.07.06 06:36
Оценка:
Вот работающий пример
                /// <summary>
                /// Сериализация объекта и его запаковка
                /// </summary>
                /// <param name="obj"></param>
                /// <returns></returns>
                public static byte[] Packing(object obj)
                {
                        SoapFormatter ser = new SoapFormatter();
                        MemoryStream mem = new MemoryStream();
                        ser.Serialize(mem, obj);

                        MemoryStream baseMem = new MemoryStream();
                        ZipOutputStream zip = new ZipOutputStream(baseMem);
                        zip.SetLevel(9);

                        ZipEntry entry = new ZipEntry("file");

                        entry.DateTime = DateTime.Now;
                        entry.Size = mem.Length;

                        Crc32 crc = new Crc32();
                        crc.Reset();
                        crc.Update(mem.ToArray());
                        entry.Crc  = crc.Value;
                        zip.PutNextEntry(entry);
                        zip.Write(mem.ToArray(), 0, (int)mem.Length);
                        zip.Close();
                        return baseMem.ToArray();
                }

                /// <summary>
                /// распаковка объекта и его дисериализация
                /// </summary>
                /// <param name="obj"></param>
                /// <returns></returns>
                public static object UnPacking(byte[] zipData)
                {
                        MemoryStream mem        = new MemoryStream(zipData);

                        ZipEntry theEntry;
                        ZipInputStream zip                = new ZipInputStream(mem);
                        MemoryStream baseMem        = new MemoryStream();
                        while((theEntry = zip.GetNextEntry()) != null)
                        {
                                int size = 2048;
                                byte[] data = new byte[2048];
                                while(true)
                                {
                                        size = zip.Read(data, 0, data.Length);
                                        if(size > 0)
                                                baseMem.Write(data, 0, size);
                                        else
                                                break;
                                }
                        }
                        zip.Close();

                        SoapFormatter ser = new SoapFormatter();
                        mem = new MemoryStream(baseMem.ToArray());
                        return ser.Deserialize(mem);
                }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.