Serialization 如何使用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,并使用Json.NET进行序列化(请参阅)

Json.NET支持BSON,由于我的一些请求包含大量二进制数据块,我认为这将大大加快我的应用程序的速度。然而,据我所知,RestSharp似乎对BSON没有任何内置支持

Json.NET的使用是作为RestSharp的自定义序列化程序实现的,因此乍一看,似乎可以修改该自定义序列化程序以使用BSON。但是,
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());