2010-03-31 2 views
0

HI압축 XML 파일

내가 웹 서비스에 보낼 필요가 5백킬로바이트 크기 xml 파일을 가지고, 그래서 난이 데이터를 압축하고 좀 들었

웹 서비스로 보내려면 뭔가를 base24Encoding ... 사람이 내가 GZipStream을 사용하는 경우 가정 내가 어떻게 사전에 웹 서비스에

감사 파일을 보낼 수있는이

에 더 많은 빛을 던질 수

답변

1

다음과 같은 내용 (첫 번째 부분은 우리가 작업하기 위해 임의의 xml을 작성합니다). 웹 서비스는 이상적으로 byte [] 인수를 취해 MTF를 기반으로 WSE3 또는 MCF를 사용하는 경우 MTOM을 사용 가능하게하여 기본 64 오버 헤드를 줄입니다. 그냥 byte[]으로 게시 한 다음 다른 쪽 끝에서 압축을 취소하십시오.

if (File.Exists("my.xml")) File.Delete("my.xml"); 
    using (XmlWriter xmlFile = XmlWriter.Create("my.xml")) { 
     Random rand = new Random(); 
     xmlFile.WriteStartElement("xml"); 
     for (int i = 0; i < 1000; i++) { 
      xmlFile.WriteElementString("add", rand.Next().ToString()); 
     } 
     xmlFile.WriteEndElement(); 
     xmlFile.Close(); 
    } 
    // now we have some xml! 
    using (MemoryStream ms = new MemoryStream()) { 
     int origBytes = 0; 
     using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) 
     using (FileStream file = File.OpenRead("my.xml")) { 
      byte[] buffer = new byte[2048]; 
      int bytes; 
      while ((bytes = file.Read(buffer, 0, buffer.Length)) > 0) { 
       zip.Write(buffer, 0, bytes); 
       origBytes += bytes; 
      } 
     } 
     byte[] blob = ms.ToArray(); 
     string asBase64 = Convert.ToBase64String(blob); 
     Console.WriteLine("Original: " + origBytes); 
     Console.WriteLine("Raw: " + blob.Length); 
     Console.WriteLine("Base64: " + asBase64.Length); 
    } 

다른 직렬화 형식을 고려하십시오. 훨씬 작고 (결과적으로 gzip 등의 이점을 얻지 못하는) 조밀 한 바이너리 프로토콜이 있습니다. 예를 들어, protobuf-net을 통해 직렬화하면 매우 효율적인 크기가됩니다. 그러나 이는 임의의 xml 데이터가 아니라 객체 모델에만 적용됩니다.

+0

감사합니다. Gravell ... 역방향 압축 코드도 사용할 수 있습니까? – Sathish

+0

프레임 워크 2.0을 사용하여 Dotnet에 대해 처음 접했기 때문에 최선의 방법을 제안 할 수 있습니까? xml은 데이터 집합에서 생성되며 데이터 집합의 원본은 ExcelBytes (OLEDB를 사용하여 읽음)가됩니다. – Sathish

+0

@ Sathish - 매우 비슷한 방법으로 압축을 푸십시오. (GZipStream unzip = new GZipStream (incoming, CompressionMode.Decompress)) { // 모두 읽는 중 ... }을 사용하여 (MemoryStream incoming = new MemoryStream (blob)) –

0

웹 서비스는 압축을 표현하는 바이트 [] 매개 변수를 수용해야하는 것이 시나리오를 처리하는 가장 좋은 방법 XML. Base64 인코딩은 자동으로 수행됩니다. 압축률을 높이려면 MTOM encoding을 사용할 수 있습니다. 이렇게하면 와이어를 통해 전송하기 위해 바이트 배열을 문자열로 변환하고 압축률이 느슨한 위치에서 Base64 단계를 수행하지 않아도됩니다. 당신이 선택할 수있는 다음과 같은 한

0

:

  1. 경우 BinaryFormatter = 새로운 ArrayList를

    ArrayList를 itemsToSerialize();

    itemsToSerialize.Add ("john"); itemsToSerialize.Add ("smith");

    스트림 스트림 = 새 FileStream (@ "MyApplicationData.dat", System.IO.FileMode.Create); IFormatter formatter = new BinaryFormatter(); formatter.Serialize (stream, itemsToSerialize);

    stream.Close();

  2. 당신은 IIS에서 호스팅되는 WCF 서비스 * HttpBinding WCF netTcpBinding이

  3. 당신이 사용할 수있는 사용하고 IIS를 통해 WCF의 gzip 압축을 설정하는 과정을 안내합니다 this blog을 수행 할 수

  4. 당신은 응답을 압축 할 수

    및 요청한 다음 압축을 풉니 다.

    새 StreamReader (새 GZipStream (webResponse.GetResponseStream(), CompressionMode.Decompress));

+0

경우 BinaryFormatter는 일반적으로 웹 서비스에 대한 매우 가난한 선택 –

+0

전 | 옵 가고 싶습니다 감사 Andrejev ... 당신은, 당신이 3를 선택할 것 기대했다 샘플 코드 – Sathish

+0

좀 도와주십시오 수 있습니다 난이 생각하기 때문에 할 가장 적합한 일입니다. –