压缩XML文件

时间:2010-03-31 09:21:18

标签: c#

HI

我有一个500KB大小的xml文件,我需要将其发送到webservice,所以我想压缩这些数据并将其发送到webservice

我听说过一些base24Encoding的东西...... 任何人都可以更多地关注这个

假设我使用GZipStream如何将文件发送到webservice

先谢谢

4 个答案:

答案 0 :(得分: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数据。

答案 1 :(得分:0)

答案 2 :(得分:0)

处理此方案的最佳方法是让您的Web服务接受一个byte []参数,该参数将表示压缩的XML。 Base64编码将自动完成。要提高压缩率,可以使用MTOM encoding。这将避免Base64步骤,该步骤包括将您的字节数组转换为字符串,以便通过线路发送它,以及您可能在压缩比率下松散的位置。

答案 3 :(得分:0)

您有以下选择:

  1. 的BinaryFormatter

    ArrayList itemsToSerialize = new ArrayList();

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

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

    stream.Close();

  2. 您可以使用WCF netTcpBinding

  3. 您可以将* HttpBinding用于IIS上托管的WCF服务,然后按this blog引导您通过IIS设置WCF gzip压缩

  4. 您可以压缩回复并请求然后将其解压缩

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