2013-08-21 28 views
7

我正在使用RestSharp並使用Json.NET進行序列化(請參閱here)。如何讓RestSharp使用BSON?

Json.NET支持BSON,並且由於我的一些請求有大量的二進制數據塊,我認爲這會顯着加速我的應用程序。但是,據我所知,RestSharp似乎沒有任何對BSON的內置支持。

Json.NET的使用是作爲RestSharp的自定義序列化程序實現的,所以乍一看看它可能會修改該自定義序列化程序以使用BSON。但是,Serialize接口的方法返回string - 這是(我認爲)不適合BSON。因此,我認爲這需要對RestSharp進行一些更重大的更改才能實現此更改。

有沒有人想出了一個辦法呢?


更新:我看了一下RestSharp來源,發現RestRequest.AddBody方法把我的對象,並將其序列化到請求主體最終調用Request.AddParameter(與序列化對象的數據,參數類型RequestBody)。

我想我可以將我的對象序列化到BSON,然後直接撥打Request.AddParameter - 事實上我可以。但是,當RestSharp然後執行RestRequest時,它無法將二進制內容放入請求中,因爲還有其他關於請求內容的嵌入假設是UTF-8編碼的。

因此它看起來像這個技巧是行不通的 - 那裏將需要作出RestSharp本身的一些變化,我不適合做這項工作...


更新2:我決定去使用調試器來弄清楚爲了克服身體編碼問題我需要改變多少RestShrp,所以我換出了我的NuGet版本的RestSharp,並將RestSharp項目包含在我的解決方案中。並且...它工作

事實證明,在過去的幾個月裏,對於尚未在NuGet版本中的RestSharp進行了更改。

所以,你可以現在使用AddParameter並傳入一個已經BSON編碼的對象,RestSharp將發送它到服務器沒有投訴。

回答

6

每在我的問題的更新,事實證明,如果你有最新的RestSharp源,則不是此:

 request.AddBody(myObject); 

...你可以,只要你有一個有效載荷,會做這個,而不是使用BSON受益:

 using (var memoryStream = new System.IO.MemoryStream()) 
     { 
      using (var bsonWriter = new Newtonsoft.Json.Bson.BsonWriter(memoryStream)) 
      { 
       var serializer = new Newtonsoft.Json.JsonSerializer(); 

       serializer.Serialize(bsonWriter, myObject); 

       var bytes = memoryStream.ToArray(); 

       request.AddParameter("application/bson", bytes, RestSharp.ParameterType.RequestBody); 
      } 
     } 

注意,要AddParameter第一個參數是所謂的參數名稱,但在ParameterType.RequestBody的情況下,它實際上是作爲內容類型。 (育)。

注意,這依賴於ewanmellor/ayoung到RestSharp發於2013年4月11日change,而這種變化是上的NuGet當前版本(104.1)。因此,這隻有在您的項目中包含當前的RestSharp源時纔有效。

3

Gary對自己問題的回答對序列化安寧的調用非常有用。我想回答如何使用JSON.NET反序列化寧靜的電話。我正在爲Silverlight使用RestSharp版本104.4。我的服務器正在使用Web API 2.1 with BSON support turned on

要接受BSON響應,創建一個BSON解串器RestSharp像這樣

public class BsonDeserializer : IDeserializer 
{ 
    public string RootElement { get; set; } 
    public string Namespace { get; set; } 
    public string DateFormat { get; set; } 

    public T Deserialize<T>(IRestResponse response) 
    { 
     using (var memoryStream = new MemoryStream(response.RawBytes)) 
     { 
      using (var bsonReader = new BsonReader(memoryStream)) 
      { 
       var serializer = new JsonSerializer(); 
       return serializer.Deserialize<T>(bsonReader); 
      } 
     } 
    } 
} 

然後,按照您的要求接受 「應用程序/ BSON」

var request = new RestRequest(apiUrl, verb); 
request.AddHeader("Accept", "application/bson"); 

,並添加一個處理程序,該媒體類型

var client = new RestClient(url); 
client.AddHandler("application/bson", new BsonDeserializer()); 
+0

這個答案幫了我很多,萬一有人得到異常「序列包含更多的臨時表ñ一個元素「添加處理程序時,我通過添加處理程序添加默認標題到RestClient實例之前解決它 – yvesmancera