2013-08-21 29 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