반응형
닷넷2.0에서 추가된 ADO.NET의 여러 기능 중 DataSet을 바이너리로 Serialize되도록 지원하기 때문에 압축이 가능해졌다. DataSet으로 데이터를 교환할 때 압축된 데이터를 전달해 성능상 큰 효과를 가져다 준다.
System.IO.Compression이라는 압축 네임스페이스가 닷넷 2.0에서는 새롭게 추가 되었다. 그럼 DataSet을 Serialize하고, 압축하는 메서드를 살펴 보도록 하자(<예제 1> 참조).
데이터 압축 예제
압축을 풀고 다시 Deserialize하는 메소드를 살펴보도록 하자. 압축을 했던 작업을 반대로 해주면 된다. 압축 해제시 DeflateStream 클래스를 이용하면 간단하게 해제할 수 있다(<예제 2> 참조).
XML 웹서비스를 이용해서 DataSet을 리턴할 경우 XML로 Serialize되어서 데이터를 전달하게 된다. XML 특성상 DataSet 의 크기는 커져 버릴 수 밖에 없다. 대용량의 데이터를 DataSet으로 운반해야 한다면 DataSet을 압축해서 문자열 변환 후에 데이터를 넘겨주는 방법을 추천한다.
<예제 1> DataSet 압축 메소드
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
public byte[] CompressDataSet(DataSet ds)
{
//1. 데이터셋 Serialize
ds.RemotingFormat = SerializationFormat.Binary;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, ds);
byte[] inbyt = ms.ToArray();
//2. 데이터 압축
System.IO.MemoryStream objStream = new MemoryStream();
System.IO.Compression.DeflateStream objZS = new System.IO.
Compression.DeflateStream(objStream,System.IO.Compression.
CompressionMode.Compress);
objZS.Write(inbyt, 0, inbyt.Length);
objZS.Flush();
objZS.Close();
//3. 데이터 리턴
return objStream.ToArray();
}
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
public byte[] CompressDataSet(DataSet ds)
{
//1. 데이터셋 Serialize
ds.RemotingFormat = SerializationFormat.Binary;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, ds);
byte[] inbyt = ms.ToArray();
//2. 데이터 압축
System.IO.MemoryStream objStream = new MemoryStream();
System.IO.Compression.DeflateStream objZS = new System.IO.
Compression.DeflateStream(objStream,System.IO.Compression.
CompressionMode.Compress);
objZS.Write(inbyt, 0, inbyt.Length);
objZS.Flush();
objZS.Close();
//3. 데이터 리턴
return objStream.ToArray();
}
<예제 2> DataSet 압축 해제 메소드
public DataSet DecompressDataSet(byte[] bytDs)
{
DataSetoutDs = new DataSet();
MemoryStream inMs = new MemoryStream(bytDs);
inMs.Seek(0, 0); //스트림으로 가져오기
//1. 압축객체 생성- 압축 풀기
DeflateStream zipStream = new DeflateStream(inMs,
CompressionMode.Decompress, true);
byte[] outByt = ReadFullStream(zipStream);
zipStream.Flush();
zipStream.Close();
MemoryStream outMs = new MemoryStream(outByt);
outMs.Seek(0, 0); //2. 스트림으로 다시변환
outDs.RemotingFormat = SerializationFormat.Binary;
//3. 데이터셋으로 Deserialize
BinaryFormatter bf = new BinaryFormatter();
outDs = (DataSet)bf.Deserialize(outMs, null);
returnoutDs;
}
public byte[] ReadFullStream(Stream stream)
{
//스트림을 Byte 배열로 변환
byte[] buffer = new byte[32768];
using (MemoryStreamms = new MemoryStream())
{
while (true)
{
intread = stream.Read(buffer, 0, buffer.Length);
if(read <= 0)
returnms.ToArray();
ms.Write(buffer, 0, read);
}
}
}
{
DataSetoutDs = new DataSet();
MemoryStream inMs = new MemoryStream(bytDs);
inMs.Seek(0, 0); //스트림으로 가져오기
//1. 압축객체 생성- 압축 풀기
DeflateStream zipStream = new DeflateStream(inMs,
CompressionMode.Decompress, true);
byte[] outByt = ReadFullStream(zipStream);
zipStream.Flush();
zipStream.Close();
MemoryStream outMs = new MemoryStream(outByt);
outMs.Seek(0, 0); //2. 스트림으로 다시변환
outDs.RemotingFormat = SerializationFormat.Binary;
//3. 데이터셋으로 Deserialize
BinaryFormatter bf = new BinaryFormatter();
outDs = (DataSet)bf.Deserialize(outMs, null);
returnoutDs;
}
public byte[] ReadFullStream(Stream stream)
{
//스트림을 Byte 배열로 변환
byte[] buffer = new byte[32768];
using (MemoryStreamms = new MemoryStream())
{
while (true)
{
intread = stream.Read(buffer, 0, buffer.Length);
if(read <= 0)
returnms.ToArray();
ms.Write(buffer, 0, read);
}
}
}
출처 : 마이크로소프트웨어 2006년 9월호 (C# 프로그래밍 테크닉)
펌: http://www.toexpert.net/tag/DataSet
닷넷 프레임워에 만들어져있지만 어떻게 스트림되서 압축되는 지 몰랐다.
좀보자 ㅋㅋ