我使用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将将其发送到服务器,而不需要抱怨。
发布于 2013-08-22 11:41:47
根据我问题中的更新,如果您有最新的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的情况下,它实际上被用作内容类型。(Yuk)
请注意,这依赖于由ewanmellor/ayoung于2013年4月11日向RestSharp发出的变化,而此更改并不在NuGet (104.1)上的当前版本中。因此,只有在项目中包含当前的RestSharp源代码时,这才能工作。
发布于 2014-10-27 18:48:11
Gary对自己问题的回答对于序列化restful调用是非常有用的。我想回答如何使用JSON.NET反序列化restful调用。我正在为Silverlight使用RestSharp版本104.4。我的服务器正在使用WebAPI2.1 打开BSON支架。
若要接受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);
}
}
}
}然后,确保您的请求接受“应用程序/bson”。
var request = new RestRequest(apiUrl, verb);
request.AddHeader("Accept", "application/bson");并为该媒体类型添加一个处理程序。
var client = new RestClient(url);
client.AddHandler("application/bson", new BsonDeserializer());https://stackoverflow.com/questions/18357134
复制相似问题