2010-03-31 139 views
0

HI压缩XML文件

我有一个500KB大小的XML文件,我需要将其发送到Web服务,所以我要压缩此数据并将其发送到Web服务

我听说过一些base24Encoding东西... 任何人都可以投入更多的光在这

假设如果我使用GZipStream如何我提前将文件发送到web服务

感谢

回答

1

像下面的东西(第一部分只是写一些随机xml供我们使用)。您的Web服务理想情况下会采用byte []参数,并且(如果使用基于http的WSE3或MCF)启用MTOM,这会减少base-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 2010-03-31 09:39:01

+0

因为我对使用框架2.0的Dotnet很新颖......你能为此建议一个最佳方法 xml是从数据集中生成的,而数据集的源将是一个excel文件(使用OLEDB读取) – Sathish 2010-03-31 09:43:57

+0

@ (GZipStream unzip = new GZipStream(incoming,CompressionMode.Decompress)) { //全部读取... }使用(MemoryStream incoming = new MemoryStream(blob))以非常相似的方式解压缩Sathish - – 2010-03-31 11:55:16

0

处理这种情况将让您的网络服务接受一个byte []参数,将代表压缩的最佳方式XML。 Base64编码将自动完成。要提高压缩率,您可以使用MTOM encoding。这将避免Base64步骤,该步骤包括将字节数组转换为字符串,以便通过电线发送,并且可能会以压缩比松动。

0

,可以有以下可供选择:

  1. 的BinaryFormatter

    ArrayList的itemsToSerialize =新的ArrayList();

    itemsToSerialize.Add(“john”); itemsToSerialize.Add(“smith”);

    Stream stream = new FileStream(@“MyApplicationData.dat”,System.IO.FileMode.Create); 012orIFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream,itemsToSerialize);

    stream.Close();

  2. 你可以使用WCF NetTcpBinding的

  3. 你可以使用* HttpBinding对于托管在IIS WCF服务,并按照this blog这将引导您完成通过IIS建立WCF gzip压缩

  4. 你可以压缩响应和请求并解压缩它

    新的StreamReader(新的GZipStream(webResponse.GetResponseStream(),CompressionMode.Decompress));

+0

BinaryFormatter的通常是Web服务非常糟糕的选择 – 2010-03-31 09:35:51

+0

感谢Andrejev 我想去3选项...你可以请帮我与示例代码 – Sathish 2010-03-31 09:54:03

+0

我希望你会选择3,因为我觉得这是最正确的事情。 – 2010-03-31 13:41:40