2013-10-14 66 views
1

我已經接受SQL服務器查詢,通過這個查詢,執行該查詢Web服務的項目,將結果傳遞迴客戶端,然後返回DataSet結果(以及一些其他屬性)。目前它使用WCF和SOAP進行通信。爲了減少總的請求時間,我試圖將其移至Web API和JSON。根據我的概念證明,這可以將總請求時間縮短約30%,這對於此服務的吞吐量非常重要。反序列化的字節數組柱JSON.net

我的問題是,一些疑問(我卻無法控制)在SQL Server中的圖像列返回數據。 JSON.net數據錶轉換器非常高興地把它當作一個字節數組來進行編碼,而base64對它進行編碼。問題發生在客戶端,同一個轉換器只是簡單地拾取這個值並將其視爲字符串,當我的項目的使用者期望它是一個字節數組時,會引發問題。

我想我可能可以在串行器上使用TypeNameHandling.All選項,但數據錶轉換器不會獲得類型爲JsonToken.StartObject的令牌作爲DataTable正文的一部分。

鑑於我無法控制正在運行的查詢,期望返回哪些數據類型並且不控制它們如何被使用,有什麼我可以做的事情來成功地傳遞一個字節數組作爲一個帶有JSON.net的數據表?

+0

你可以發佈一些示例代碼?一般來說,DataSets/DataTables通過網絡傳輸相當昂貴。您是否考慮過使用DTO(數據傳輸對象)? –

+0

不幸的是,DTO不適合我,我需要能夠支持客戶端可以向我發送的任何SQL查詢(或者至少是其中很大一部分)。 – knightpfhor

回答

0

默認轉換器根本的問題是,它試圖意味着對數據純粹基於的數據類型。當時我並沒有意識到問題的存在,但我還需要確保當我在我的服務器上進行反序列化時,我可以得到完全相同的數據表。

所以我的解決方案是創建我自己的轉換器的實現DataSetDataTable。它輸出的JSON並不像默認創建的那麼漂亮,但是如果你傳輸的數據超過1行,它應該產生更緊湊的JSON。代碼太大而無法在SO上張貼,因此我已將整個項目放在GitHub上。

0

最簡單的方法來解決,這是在客戶端轉換該base64編碼字符串byte []

string myPicture= dataRow["MY_PICTURE"].ToString(); 
myPicture= myPicture.Replace(" ", "+"); //Optional 
byte[] myPictureInByte = Convert.FromBase64String(myPicture); 

第二行是可選的。當客戶端反序列化時,我得到了base64沒有「+」的編碼字符串。所以我將它們添加回字符串並轉換爲byte []

+0

我的問題不是能夠反序列化它,問題是客戶端無法區分什麼是Base64編碼圖像和什麼只是一個字符串 – knightpfhor