使用自定义序列化器问题扩展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。
我还在解决方案中添加了一个新项目。即使在那里,代码也能工作。所以这只是一个有问题的项目。
既然你不能在一个新项目中复制它,那么在这个特定的项目中一定有什么不同的事情发生,导致了你所描述的问题。
您可以尝试以下几件事(顺序不分先后):
-
检查你在两个项目中使用完全相同的库版本(一个工作和一个不工作):包版本和目标平台(net4, net35…)
-
删除你的非工作项目的
packages
文件夹,这样NuGet将被迫重新下载所有的包。 -
当您从参考节点中选择RestSharp时,在Visual Studio属性窗口中查找引用库的确切路径。
在工作项目和非工作项目中引用的库之间进行二进制比较。 不幸的是,SymbolSource上没有RestSharp的符号包,所以你不能在非工作项目中直接调试RestSharp。你可以用Reflector。. NET VSPro,如果您有许可证或以前没有使用过试用版。
将非工作项目的部分移动到工作项目,直到它停止工作。
查看RestRequest
的源代码,AddObject
似乎没有使用您正在设置的JsonSerializer
。你试过用AddBody
代替吗?