본문 바로가기
개발언어/ASP.NET

DataSet 압축하기

by 엔돌슨 2008. 10. 30.
반응형

닷넷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();
}

<예제 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);
    }
  }
}



출처 : 마이크로소프트웨어 2006년 9월호 (C# 프로그래밍 테크닉)

펌: http://www.toexpert.net/tag/DataSet


닷넷 프레임워에 만들어져있지만 어떻게 스트림되서 압축되는 지 몰랐다.
좀보자 ㅋㅋ