데이터베이스에 BLOB로 저장하려는 메모리에 큰 개체가 있습니다. 데이터베이스 서버가 대개 로컬이 아니기 때문에 저장하기 전에 압축하려고합니다.오브젝트를 직렬화하는 방법 + 타사 라이브러리없이 압축 한 다음 압축 해제 + 비 직렬화하는 방법은 무엇입니까?
이것은 내가 지금 무엇을 가지고 :
using (var memoryStream = new MemoryStream())
{
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(gZipStream, obj);
return memoryStream.ToArray();
}
}
내가 총 사령관과 같은 바이트를 압축 그러나이 50 % 이상으로 항상 크기를 줄인다. 위 코드를 사용하면 58MB에서 48MB로 압축되고 15MB보다 작은 파일은 더 커집니다.
제 3 자 우편 라이브러리를 사용해야합니까, 아니면 .NET 3.5에서 더 좋은 방법이 있습니까? 다른 문제는 무엇입니까?
편집 :
그냥 위의 코드에서 버그를 발견. 앤젤로가 고마워.
GZipStream 압축은 여전히 크지 않습니다. 나는 TC 48 % 압축에 비해 gZipStream에 의해 평균 35 % 압축을 얻습니다.
은 내가 이전 버전 : 함께 얻고 있었다 바이트의 어떤 종류의 아무 생각이
EDIT2 : 나는 47 % 20 %에서 압축을 향상시키는 방법을 발견했다
. 하나 대신 2 개의 메모리 스트림을 사용해야했습니다! 아무도 이유를 설명 할 수 있을까요?
다음은 2 개의 메모리 스트림이 포함 된 코드로 더 나은 압축을 제공합니다 !!! 사용
using (MemoryStream msCompressed = new MemoryStream())
using (GZipStream gZipStream = new GZipStream(msCompressed, CompressionMode.Compress))
using (MemoryStream msDecompressed = new MemoryStream())
{
new BinaryFormatter().Serialize(msDecompressed, obj);
byte[] byteArray = msDecompressed.ToArray();
gZipStream.Write(byteArray, 0, byteArray.Length);
gZipStream.Close();
return msCompressed.ToArray();
}
나는 http : //www.icsharpcode를 사용합니다.그물/opensource/sharpziplib/Download.aspx 큰 성공. – Asken