我正在使用RestSharp,并使用Json.NET进行序列化(请参阅此处)。
Json.NET支持BSON,而且由于我的一些请求有巨大的二进制数据块,我认为这将大大加快我的应用程序。然而,据我所知,RestSharp似乎对BSON没有任何内置支持。
Json.NET的使用是作为RestSharp的自定义序列化程序实现的,因此乍一看,可以将该自定义序列化程序修改为使用BSON。但是,RestSharp.Serializers.ISerializer
接口的Serialize
方法返回一个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将毫无怨言地将其发送到服务器。
根据我问题中的更新,事实证明,如果你有最新的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
的情况下,它实际上被用作内容类型。(余)。
请注意,这依赖于ewanmellor/ayoung于2013年4月11日对RestSharp所做的更改,并且在NuGet(104.1)的当前版本中,此更改是而不是。因此,只有在您的项目中包含当前RestSharp源代码时,此更改才会起作用。
Gary对自己问题的回答对于序列化restful调用非常有用。我想回答如何使用JSON.NET反序列化restful调用。我使用的是用于Silverlight的RestSharp 104.4版本。我的服务器正在使用Web API 2.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);
}
}
}
}
然后,确保您的请求接受"application/bson"
var request = new RestRequest(apiUrl, verb);
request.AddHeader("Accept", "application/bson");
并为该媒体类型添加一个处理程序
var client = new RestClient(url);
client.AddHandler("application/bson", new BsonDeserializer());