Serialization 如何使用BSON?
我使用RestSharp,并使用Json.NET进行序列化(请参阅) Json.NET支持BSON,由于我的一些请求包含大量二进制数据块,我认为这将大大加快我的应用程序的速度。然而,据我所知,RestSharp似乎对BSON没有任何内置支持 Json.NET的使用是作为RestSharp的自定义序列化程序实现的,因此乍一看,似乎可以修改该自定义序列化程序以使用BSON。但是,Serialization 如何使用BSON?,serialization,json.net,restsharp,bson,Serialization,Json.net,Restsharp,Bson,我使用RestSharp,并使用Json.NET进行序列化(请参阅) Json.NET支持BSON,由于我的一些请求包含大量二进制数据块,我认为这将大大加快我的应用程序的速度。然而,据我所知,RestSharp似乎对BSON没有任何内置支持 Json.NET的使用是作为RestSharp的自定义序列化程序实现的,因此乍一看,似乎可以修改该自定义序列化程序以使用BSON。但是,RestSharp.Serializers.ISerializer接口的Serialize方法返回一个字符串,该字符串(我
RestSharp.Serializers.ISerializer
接口的Serialize
方法返回一个字符串,该字符串(我假设)不适合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的情况下,它实际上被用作内容类型。(Yuk)
请注意,这取决于ewanmellor/Ayong于2013年4月11日对RestSharp所做的更改,而此更改不在NuGet(104.1)的当前版本中。因此,只有在项目中包含当前的RestSharp源代码时,这才有效。Gary对自己问题的回答对于序列化restful调用非常有用。我想回答如何使用反序列化restful调用。我正在为Silverlight使用RestSharp版本104.4。我的服务器使用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);
}
}
}
}
并为该媒体类型添加处理程序
var client = new RestClient(url);
client.AddHandler("application/bson", new BsonDeserializer());
这个答案对我帮助很大,如果有人在添加处理程序时遇到异常“Sequence contains more one element”,我通过在向RestClient实例添加默认头之前添加处理程序来修复它
var client = new RestClient(url);
client.AddHandler("application/bson", new BsonDeserializer());