首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使RestSharp使用BSON?

如何使RestSharp使用BSON?
EN

Stack Overflow用户
提问于 2013-08-21 12:13:52
回答 2查看 1.3K关注 0票数 7

我使用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编码的嵌入式假设。

因此,看起来这个黑客是行不通的--需要对RestSharp本身做一些修改,而我并不适合这个工作……

更新2:我决定尝试使用调试器来计算我需要修改多少RestSharp来克服身体编码问题,所以我换掉了NuGet版本的RestSharp,并将RestSharp项目包括在我的解决方案中。还有..。它是工作的

事实证明,在过去几个月中,RestSharp发生了变化,而NuGet版本还没有改变。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-22 11:41:47

根据我问题中的更新,如果您有最新的RestSharp源代码,那么就不是这样:

代码语言:javascript
复制
        request.AddBody(myObject);

..。您可以在有有效负载的情况下使用BSON,而可以这样做:

代码语言:javascript
复制
        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的情况下,它实际上被用作内容类型。(Yuk)

请注意,这依赖于由ewanmellor/ayoung于2013年4月11日向RestSharp发出的变化,而此更改并不在NuGet (104.1)上的当前版本中。因此,只有在项目中包含当前的RestSharp源代码时,这才能工作。

票数 6
EN

Stack Overflow用户

发布于 2014-10-27 18:48:11

Gary对自己问题的回答对于序列化restful调用是非常有用的。我想回答如何使用JSON.NET反序列化restful调用。我正在为Silverlight使用RestSharp版本104.4。我的服务器正在使用WebAPI2.1 打开BSON支架

若要接受BSON响应,请为RestSharp创建一个BSON反序列化器,如下所示

代码语言:javascript
复制
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”。

代码语言:javascript
复制
var request = new RestRequest(apiUrl, verb);
request.AddHeader("Accept", "application/bson");

并为该媒体类型添加一个处理程序。

代码语言:javascript
复制
var client = new RestClient(url);
client.AddHandler("application/bson", new BsonDeserializer());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18357134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档