2010-06-15 26 views
24

Busco a algunas recomendaciones acerca de la compresión de datos en .NET, aparte de usar la clase GZipStream. Estoy buscando compresión rápida y alta de matrices de bytes para poder enviarlas a través de tcp.Recomendaciones para la biblioteca de compresión .NET

Gracias.

+0

Ayudaría si explica por qué/si no le gusta 'GZipStream'. –

+0

No digo que no me guste, solo busco alternativas que me puedan dar un mejor rendimiento y mayores índices de compresión. Las bibliotecas comerciales también son bienvenidas –

Respuesta

4

SharpZipLib es una alternativa. Se dice que está escrito más cuidadosamente que el GZipStream biblioteca marco

+0

Definitivamente lo verificará - gracias –

+7

SharpZipLib no se ha mantenido y con errores. Último lanzamiento en junio de 2010. A veces tiene problemas con los archivos zip producidos por 7zip, ioniczip, etc., a pesar de que los archivos zip son completamente buenos. Lo usamos para un componente en mi trabajo y tuve que recurrir a arreglar la fuente y la construcción a nivel local, lo cual no es gran cosa, pero no es algo en lo que quiera meterse si está buscando una biblioteca zip lista para usar. . – aggieNick02

+0

@ aggieNick02 ¿Podría cargar el código fuente fijo? – mafu

8

DotNetZip ofrece soporte nativo y tiene una API bastante agradable y es mi opinión más flexible que SharpZipLib:

DotNetZip

EDIT: Por desgracia, DotNetZip tiene algunos problemas críticos y el proyecto ya no parece ser activa se mantenga. Por lo tanto, esta biblioteca realmente no se puede recomendar para su uso en el código de producción.

Las mejores alternativas serían utilizar SharpZipLib (si cumple con su licencia basada en GPL), uno de los .NET ports of zlib o el soporte zip de .NET 4.5 como se muestra en this answer.

+0

He tenido malas experiencias con DotNetZip, no puedo abrir archivos comprimidos que se pueden abrir perfectamente con otras bibliotecas. Lanza, p. OverflowException por alguna razón, que no pude descifrar. – lama12345

+0

@ lama12345: Gracias por señalar esto. Por ahora, también estoy al tanto de los problemas de DotNetZip, ya que esos también me han mordido. Actualicé mi respuesta. –

+0

@ Cheeso: ¿Alguna actualización sobre el futuro del proyecto DotNetZip? ¿Hay alguna manera en que se pueda apoyar el proyecto? –

10

Si está comprimiendo los datos , entonces puede ver la serialización de alta densidad, en lugar de la compresión. Algo así como protobuf. Hay un few C# implementations here. Para objetos existentes, protobuf-net es IMO el más simple de implementar (revelación: soy el autor, pero es gratis, etc.). Solo se serializa en la transmisión, o si quiere un byte[], un MemoryStream por separado.

Para uso continuo sobre un socket (en lugar de la solicitud discreta/respuesta de HTTP), sugeriría mirar los Serializer.SerializeWithLengthPrefix/Serializer.DeserializeWithLengthPrefix operaciones (protobuf no lo hace sí incluyen un terminador, por lo que una longitud- el prefijo es necesario para manejar mensajes separados).

+0

muy interesante - lo intentaré. gracias –

+0

Marc, ¿qué significa "serialización de alta densidad", especialmente en contraste con la compresión? ¿Hace uso de cualquier esquema de compresión o es solo una forma eficiente de representar datos? ¿Podría dar una breve explicación o un puntero para seguir leyendo? –

+0

@ 0xA3 - lo que quiero decir es: si se trata de datos de aplicaciones típicas (que puede representar como xml o JSON), utilice un serializador diferente para escribir los mismos datos en menos bytes. Entonces, en lugar de '', escriba 2 o 3 bytes en su lugar. Sin embargo, no es adecuado para * arbitrary * 'byte []'. –

1

.NET 3+ ha incorporado en el soporte Zip ahora, con la clase ZipPackage.

+0

Desafortunadamente, esto solo ofrece algún tipo de soporte zip. Le permite crear "paquetes" basados ​​en zip, pero estos paquetes no son archivos zip puros sino paquetes como se describe en las Convenciones de OpenPackaging (formato OPC). Estos paquetes consisten en elementos PackagePart y PackageRelationship. Este formato es probablemente mejor conocido como el formato contenedor utilizado por el formato Office OpenXML. –

+0

¿Qué pasa con la biblioteca zip de IONIC? –

1

Se supone que LZMA se encuentra entre los mejores para la compresión. 7-Zip es una aplicación SDK de dominio público de LZMA, que pueden descargarse gratuitamente aquí:

http://www.7-zip.org/sdk.html

Wikipedia on compression algorithms:

de 7z algoritmo LZMA alcanza una mayor proporción compresión de RAR, a excepción de "multimedia "archivos como .wav y .bmp archivos donde RAR usa rutinas especializadas que superan a LZMA. [7] Otro software de compresión libre tal como NanoZip y FreeArc por lo general superan WinRAR. [8]

+0

Soy un gran fanático de 7-zip, pero no estoy seguro de cuán accesible es la API. –

+2

El enlace apunta a LZMA SDK que tiene una API de C# y es de dominio público. – code4life

+0

Lamentablemente, el SDK de C# no se actualizó en 10 años y no es compatible con LZMA2. – mafu

Cuestiones relacionadas