--------------------------------------------------------------


닷넷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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
<예제 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(00); //스트림으로 가져오기
 
//1. 압축객체 생성- 압축 풀기
DeflateStream zipStream = new DeflateStream(inMs,
CompressionMode.Decompress, true);
byte[] outByt = ReadFullStream(zipStream);
zipStream.Flush();
zipStream.Close();
MemoryStream outMs = new MemoryStream(outByt);
outMs.Seek(00); //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);
}
}
}
 
cs



출처 : http://ndolson.com/479#recentTrackback 출처: http://terrorjang.tistory.com/37 [개발자 공간]


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



출처 : http://tittylouis.blogspot.kr/2011/02/compressing-and-decompressing-dataset.html

Compressing and Decompressing Dataset in C#



Some times we need to Compress the Dataset, if it holds large data, before sending over network. If you are using web services or WCF Services ,It is better to compress the dataset to byte array before sending over the network. You can decompress the byte array to dataset. Here is some code snippet to do that using System.IO.Compression.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
  using System.IO;
  using System.Data;
  using System.IO.Compression;
   
  namespace TestApp
  {
      public class DataSetCompressor
      {
   
          public Byte[] Compress(DataSet dataset) 
          { 
              Byte[] data; 
              MemoryStream mem = new MemoryStream(); 
              GZipStream zip = new GZipStream(mem, CompressionMode.Compress); 
              dataset.WriteXml(zip, XmlWriteMode.WriteSchema);
              zip.Close();
              data = mem.ToArray();
              mem.Close(); 
              return data; 
          }          
          public DataSet Decompress(Byte[] data) 
          { 
              MemoryStream mem = new MemoryStream(data);
              GZipStream zip = new GZipStream(mem, CompressionMode.Decompress); 
              DataSet dataset = new DataSet(); 
              dataset.ReadXml(zip, XmlReadMode.ReadSchema); 
              zip.Close();
              mem.Close();
              return dataset;
          }
      }
  }
cs


Posted by 요지
,