如何让RestSharp使用BSON?

Gar*_*ill 7 serialization json.net bson restsharp

我正在使用RestSharp,并使用Json.NET进行序列化(请参阅此处).

Json.NET支持BSON,由于我的一些请求有大量的二进制数据块,我认为这会大大加快我的应用程序.但是,据我所知,RestSharp似乎没有任何内置的BSON支持.

使用Json.NET作为RestSharp的自定义序列化程序实现,因此乍一看它似乎可以修改该自定义序列化程序以使用BSON.但是,接口的Serialize方法RestSharp.Serializers.ISerializer返回string- 这是(我假设)不适合BSON.因此,我假设需要对RestSharp进行一些更重要的更改才能实现此更改.

有没有人想出办法做到这一点?


更新:我查看了RestSharp源代码,发现RestRequest.AddBody接受我的对象并将其序列化到请求体中的方法最终调用Request.AddParameter(使用序列化对象数据和参数类型RequestBody).

我想我可能能够将我的对象序列化为BSON,然后Request.AddParameter直接调用- 事实上我可以.但是,当RestSharp然后执行时RestRequest,它无法将二进制内容放入请求中,因为有关于请求内容的其他嵌入式假设是UTF-8编码的.

因此看起来这个hack不起作用 - 需要对RestSharp本身进行一些更改,而且我不是那个工作的人......


更新2:我决定使用调试器来计算我需要更改多少RestSharp以克服正文编码问题,所以我换掉了我的NuGet版本的RestSharp并将RestSharp项目包含在我的解.而且......它奏效了.

事实证明,在过去的几个月里,RestSharp已经发生了变化,而NuGet版本还没有.

因此,您现在可以使用AddParameter并传入已经BSON编码的对象,而RestSharp会将其发送到服务器而不会抱怨.

Gar*_*ill 6

根据我的问题中的更新,事实证明如果你有最新的RestSharp源,那么代替这个:

        request.AddBody(myObject);
Run Code Online (Sandbox Code Playgroud)

...只要您拥有可以从使用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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

请注意,第一个参数to AddParameter应该是参数名称,但ParameterType.RequestBody实际上它用作内容类型.(育).

请注意,这依赖于改变由ewanmellor/ayoung到RestSharp发于2013年4月11日,而这种变化是不是对的NuGet(104.1)的最新版本.因此,只有在项目中包含当前的RestSharp源时,这才有效.