使用自定义序列化器问题扩展RestSharp序列化

本文关键字:序列化 扩展 RestSharp 问题 自定义 | 更新日期: 2023-09-27 18:15:56

我正在尝试通过使用Json.net库来改进默认的RestSharp序列化。为了自定义序列化,您必须实现ISerializer接口:

public class LowerCaseSerializer : ISerializer{
    public LowerCaseSerializer(){
        ContentType = "application/json";
    }
    public string Serialize(object obj){
         var settings = new JsonSerializerSettings{
            ContractResolver = new LowerCaseResolver()
        };
        return JsonConvert.SerializeObject(obj, Formatting.None, settings);
    }
    string ISerializer.RootElement { get; set; }
    string ISerializer.Namespace { get; set; }
    string ISerializer.DateFormat { get; set; }
    public string ContentType { get; set; }
}

如你所见,我也扩展了ContractResolver。这是执行小写字母的实际代码:

public class LowerCaseResolver : DefaultContractResolver{
    protected override string ResolvePropertyName(string propertyName){
        return propertyName.ToLower();
    }
}

一旦所有这些设置好了,我可以使用RestSharp:

var request = new RestRequest(url, method);
if (ShouldAddBody(method)){
    request.JsonSerializer = new LowerCaseSerializer();
    request.AddObject(body);
}
var response = client.Execute<T>(request);

一切正常,除了属性不是小写的。调试时,调试器进入序列化器的构造函数,但它的方法永远不会被调用。当我对反序列化(idesserialize接口,附加到客户端)进行完全相同的尝试时,对每个属性调用小写的方法。

我也试过的:

request.RequestFormat = DataFormat.Json;  // no change
// this correctly lower cases the properties
var json = new LowerCaseSerializer().Serialize(body);
// wrong request sent to the server, it tells me that some property is missing
request.AddBody(json);
// the exact same thing with this
request.AddParameter("application/json", json, ParameterType.RequestBody);

我注意到最后两个:如果我有小写属性并让RestSharp序列化,那么请求有5个参数(每个属性一个)。如果我通过上面两个方法添加它它只有一个属性那就是整个json。

我检查了RestSharp问题,但无济于事。有什么建议吗?

更新:

这个很奇怪:

  • fork了RestSharp,安装了Json.net,工作正常
  • 从RestSharp fork复制RestRequest类,粘贴到我的应用程序,使用它,工作正常
  • 启动新项目,通过包管理器安装RestSharp和Json.net,工作正常

然后从我的主应用程序中删除所有包,重新下载,不工作。有点放弃了。

更新2:

在调试分叉版本时,我注意到:RequestFormat必须是Dataformat。Json或者它将使用Xml序列化器。但这并不能解决问题。我尝试将两个(只有两个)序列化器设置为null:

request.JsonSerializer = null;
request.XmlSerializer = null;

在新项目中,我这样做会导致NullReferrenceException。但是在旧的世界里什么都没有发生。我试着重命名变量,使相同类型的另一个变量,但没有修复。似乎在项目中,我有RestRequest类不知何故被bug。

我还在解决方案中添加了一个新项目。即使在那里,代码也能工作。所以这只是一个有问题的项目。

使用自定义序列化器问题扩展RestSharp序列化

既然你不能在一个新项目中复制它,那么在这个特定的项目中一定有什么不同的事情发生,导致了你所描述的问题。

您可以尝试以下几件事(顺序不分先后):

  • 检查你在两个项目中使用完全相同的库版本(一个工作和一个不工作):包版本和目标平台(net4, net35…)

  • 删除你的非工作项目的packages文件夹,这样NuGet将被迫重新下载所有的包。

  • 当您从参考节点中选择RestSharp时,在Visual Studio属性窗口中查找引用库的确切路径。

  • 在工作项目和非工作项目中引用的库之间进行二进制比较。
  • 不幸的是,SymbolSource上没有RestSharp的符号包,所以你不能在非工作项目中直接调试RestSharp。你可以用Reflector。. NET VSPro,如果您有许可证或以前没有使用过试用版。

  • 将非工作项目的部分移动到工作项目,直到它停止工作。

编辑:

查看RestRequest的源代码,AddObject似乎没有使用您正在设置的JsonSerializer。你试过用AddBody代替吗?