2009-11-03 40 views
0

我正在通过Web服务将消息传输到移动设备。数据是一个xml字符串,我使用GZipStream进行压缩,然后使用Base64进行编码。 我在模拟器中发现了内存异常,并希望优化进程,因此我停止了按值传递字符串并删除了字节数组的不必要副本。 现在我想知道Base64编码。它增加了消息的大小,处理和内存要求。这是绝对必要的吗?我需要在我的Web服务中使用Base 64进行编码吗?

编辑:这是我怎样解压缩:

public static byte[] ConvertMessageStringToByteArray(ref string isXml) 
{ 
    return fDecompress(Convert.FromBase64String(isXml)); 
} 

public static byte[] fDecompress(byte[] ivBytes) 
{ 
    const int INT_BufferSize = 2048; 

    using (MemoryStream lvMSIn = new MemoryStream(ivBytes)) 
    using (GZipInputStream lvZipStream = new GZipInputStream(lvMSIn, ivBytes.Length)) 
    using (MemoryStream lvMSOut = new MemoryStream()) 
    { 
    byte[] lvBuffer = new byte[INT_BufferSize]; 
    int liSize; 
    while (true) 
    { 
     liSize = lvZipStream.Read(lvBuffer, 0, INT_BufferSize); 
     if (liSize <= 0) 
     break; 

     lvMSOut.Write(lvBuffer, 0, liSize); 
    } 

    return lvMSOut.ToArray(); 
    } 
} 
+1

你告诉我们。为什么你压缩和编码而不是直接传递XML? – skaffman 2009-11-03 09:51:18

+0

我认为压缩消息以节省带宽是有意义的。然而,如果你看看代码,我最终会在内存中得到大量的消息副本: 作为一个字符串两次(因为Convert.FromBase64String调用), ss未经压缩的MemoryStream和经过压缩的MemoryStream。所以我想我可能会抛弃字符串,并从Web服务调用中获取一个byte [],但我想知道是否可以抛弃Base64编码。你是否建议我不要压缩?这肯定是最简单的.......... – Colin 2009-11-03 12:15:59

回答

1

gzip的(这是G​​ZipStream内部)产生二进制数据 - 它们将不装配到7位的文本消息(SOAP是文本消息)除非你在他们身上执行诸如base64编码之类的事情。

也许解决方案是不对整个缓冲区进行gzip/encode(decode/ungzip),但是使用流 - 将gzipping流连接到编码流并从后者的输出读取结果(或连接将流解码为非压缩流)。这样你有机会消耗更少的内存。

相关问题