SharpZipLib - альтернатива. Говорят, что она написана более продуманно, чем фреймворковая библиотека GZipStream
.NET 3+ теперь имеет встроенную поддержку Zip с классом ZipPackage .
Если вы сжимаете данные, то вы можете рассмотреть сериализацию с высокой плотностью, а не сжатие. Что-то вроде protobuf. Здесь есть несколько реализаций на C#. Для существующих объектов protobuf-net является IMO самым простым в реализации (раскрытие: я автор - но он бесплатный и т.д.). Вы просто сериализуете в поток, или, если вам нужен байт[]
, отдельный MemoryStream
.
Для непрерывного использования через сокет (а не дискретный запрос/ответ HTTP), я бы предложил посмотреть на Serializer.SerializeWithLengthPrefix
/ Serializer. DeserializeWithLengthPrefix
(protobuf не сам включает терминатор, поэтому для обработки отдельных сообщений необходим префикс длины).
DotNetZip предлагает нативную поддержку, имеет довольно дружественный API и, на мой взгляд, более гибкий, чем SharpZipLib:
EDIT: К сожалению, DotNetZip имеет некоторые критические проблемы, и проект, похоже, больше не поддерживается. Поэтому эта библиотека не может быть рекомендована для использования в производственном коде.
Лучшей альтернативой может быть использование SharpZipLib (если вы соблюдаете их лицензию на основе GPL), одного из .NET-портов zlib или поддержки zip в .NET 4.5, как показано в этом ответе.
LZMA считается одним из лучших для сжатия. 7-Zip - это реализация LZMA в SDK с открытым доступом, свободно загружаемая здесь:
Википедия об алгоритмах сжатия:
Алгоритм LZMA в 7z достигает более высокой степени сжатия, чем в RAR. степени сжатия, чем RAR, за исключением "мультимедийных" файлов, таких как .wav и .bmp где RAR использует специализированные процедуры, которые превосходят LZMA.[7]. Другие бесплатные программы сжатия, такие как такие как NanoZip и FreeArc, обычно превосходят WinRAR.[8]