2009-11-03 73 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流連接到編碼流並從後者的輸出讀取結果(或連接將流解碼爲非壓縮流)。這樣你有機會消耗更少的內存。

相關問題