2013-08-21 4 views
7

私はRestSharpを使用しており、シリアル化にはJson.NETを使用しています(hereを参照)。RestSharpにBSONを使用させるにはどうすればいいですか?

Json.NETはBSONをサポートしています。私の要求の中には、膨大なバイナリデータブロックがあるため、アプリケーションを大幅に高速化できると思います。しかし、私が知る限り、RestSharpはBSONの内蔵サポートを持っていないようです。

Json.NETの使用は、RestSharpのカスタムシリアライザとして実装されています。そのため、一見すると、カスタムシリアルライザを変更してBSONを使用できるように見えます。しかし、RestSharp.Serializers.ISerializerインターフェイスのSerializeメソッドは、stringを返します。これはBSONには適していません。したがって、この変更を実装するためにRestSharpにさらに重要な変更が加えられると思います。

誰かがこれを行う方法を考え出しましたか?


アップデート:私はRestSharpソースを見て、私のオブジェクトを受け取り、リクエストボディにそれをシリアライズRestRequest.AddBody方法は、最終的に(シリアル化されたオブジェクトのデータで、およびパラメータの型RequestBodyRequest.AddParameterを呼び出すことを発見しました。

オブジェクトをBSONにシリアル化してRequest.AddParameterを直接呼び出すことができると私は考えました。しかし、RestSharpがRestRequestを実行すると、要求内容がUTF-8でエンコードされていると仮定するため、バイナリコンテンツを要求に入れることができません。このハックが働かないようにこのように見える

- そこに自分自身をRestSharpするために作られたいくつかの変更をする必要があり、私は仕事のための人間じゃないでしょう...


アップデート2:Iデバッガを使用して、Body-Encodingの問題を解決するためにRestSharpをどれだけ変更する必要があるかを把握することにしたので、RestSharpのNuGetバージョンを交換し、RestSharpプロジェクトを私のソリューションに含めました。そして...それを働いた。

ここ数ヶ月でRestSharpに変更があり、まだNuGetバージョンにはないことが判明しました。

は現在AddParameterを使用し、すでにBSONエンコードされたオブジェクトを渡します。RestSharpはそれをサーバーに送信します。

 request.AddBody(myObject); 

あなたが希望ペイロードを持っている時はいつでも...あなたの代わりにこれを行うことができます:

私の質問では、更新毎

答えて

6

、それはあなたが、その後、これに代えて、最新RestSharpソースを持っている場合ことが判明しますBSONを使用して恩恵を受ける:AddParameterへの最初のパラメータはおそらくパラメータ名ですが、ParameterType.RequestBodyの場合には、それが実際にコンテンツタイプとして使われていることを

 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); 
      } 
     } 

注意。 (Yuk)。これはewanmellor/ayoungによって2013年4月11日にRestSharpに対して行わchangeに依存し、この変化はNuGet(104.1)上の現在のバージョンでないこと

注。したがって、現在のRestSharpソースをプロジェクトに含める場合にのみ機能します。

3

ゲイリー自身の質問に対する答えは、安らかな呼び出しをシリアル化するのに非常に便利でした。 JSON.NETを使用して安心して通話をデシリアライズする方法にお答えしたいと思います。私はRestSharpバージョン104.4をSilverlight用に使用しています。私のサーバーはWeb API 2.1 with BSON support turned onを使用しています。

は、そのように

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); 
      } 
     } 
    } 
} 

ようRestSharpためBSONデシリアライザを作成し、BSONの応答を受け入れるあなたの要求を確実にするために、 "アプリケーション/ BSON"

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

を受け入れ、そのメディアのためのハンドラを追加タイプ

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

この回答は、誰かが例外を取得する場合に役立ちました。「Sequence contains tha more n個の要素 "を追加した後、RestClientインスタンスにDefault Headersを追加する前にHandlerを追加して修正しました – yvesmancera

関連する問題