7

私は RestSharp を使用しており、シリアル化には Json.NET を使用しています (こちらを参照)。

Json.NET は BSON をサポートしています。私の要求にはバイナリ データの巨大なブロックが含まれているため、これによりアプリケーションが劇的に高速化されると思います。ただし、私が知る限り、RestSharp には BSON のサポートが組み込まれていないようです。

Json.NET の使用は、RestSharp のカスタム シリアライザーとして実装されているため、一見すると、そのカスタム シリアライザーを変更して BSON を使用できるように見えます。しかし、インターフェースのSerializeメソッドは- を返しますが、これは (私が推測するに) BSON には不向きです。したがって、この変更を実装するには、RestSharp にさらに大きな変更を加える必要があると思います。RestSharp.Serializers.ISerializerstring

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


更新: RestSharp ソースを調べたところRestRequest.AddBody、オブジェクトを受け取り、それを要求本文にシリアル化するメソッドが最終的にRequest.AddParameter(シリアル化されたオブジェクト データとパラメーター type を使用してRequestBody) を呼び出すことがわかりました。

オブジェクトを BSON にシリアライズしてRequest.AddParameter直接呼び出すことができるかもしれないと考えました。ただし、RestSharp が を実行するとRestRequest、要求コンテンツが UTF-8 でエンコードされているという前提が他にも組み込まれているため、バイナリ コンテンツを要求に入れることができません。

したがって、このハックは機能しないようです-RestSharp自体にいくつかの変更を加える必要があり、私はその仕事の担当者ではありません...


更新 2: デバッガーを使用して、ボディ エンコーディングの問題を克服するために RestSharp をどの程度変更する必要があるかを調べることにしたので、RestSharp の NuGet バージョンを交換し、RestSharp プロジェクトを解決。そして...うまくいきました。

ここ数か月で、NuGet バージョンにはまだ含まれていない変更が RestSharp にあったことがわかりました。

したがって、既に BSON でエンコードされたオブジェクトを使用して渡すことができるAddParameterようになり、RestSharp は問題なくそれをサーバーに送信します。

4

2 に答える 2

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実際にはコンテンツ タイプとして使用されていることに注意してください。(ユク)。

これは、 2013 年 4 月 11 日に ewanmellor/ayoung によって RestSharp に加えられた変更に依存しており、この変更はNuGet (104.1) の現在のバージョンには含まれていないことに注意してください。したがって、これはプロジェクトに現在の RestSharp ソースを含める場合にのみ機能します。

于 2013-08-22T11:41:47.340 に答える
3

彼自身の質問に対する Gary の回答は、安らかな通話をシリアル化するのに非常に役立ちました。JSON.NETを使用して安静な呼び出しを逆シリアル化する方法に答えたかったのです。Silverlight 用の RestSharp バージョン 104.4 を使用しています。私のサーバーは、BSON サポートを有効にしたWeb API 2.1 を使用しています。

BSON 応答を受け入れるには、次のように RestSharp 用の BSON デシリアライザーを作成します。

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

次に、リクエストが「application/bson」を受け入れることを確認します

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

そのメディア タイプのハンドラを追加します。

var client = new RestClient(url);
client.AddHandler("application/bson", new BsonDeserializer());
于 2014-10-27T18:48:11.780 に答える