使用自定义序列化器问题扩展RETSHARP序列化
-
23-12-2019 - |
题
我正在尝试通过使用json.net库来改进默认的reasharp序列化。为了自定义序列化,您必须实现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; }
}
.
你看,我也在扩大僵制。这是DeplyCasing的实际代码:
public class LowerCaseResolver : DefaultContractResolver{
protected override string ResolvePropertyName(string propertyName){
return propertyName.ToLower();
}
}
.
一旦设置所有这些,我可以使用reakarp:
var request = new RestRequest(url, method);
if (ShouldAddBody(method)){
request.JsonSerializer = new LowerCaseSerializer();
request.AddObject(body);
}
var response = client.Execute<T>(request);
.
一切工作,除了属性不是小写的。调试调试器时,调试程序进入Serializers的构造函数,但它的方法永远不会调用。当我尝试完全相同的Deserializations时(IDeserialize接口附加到客户端),每个属性都调用了下壳的方法。
我还尝试了什么:
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);
.
我注意到最后两种的东西:如果我有小写属性,并且etharp序列化序列化,那么请求有5个参数(每个属性一个)。如果我通过大量添加它,它只有一个属性,这是整个JSON。
我检查剩下的休息问题无济于事。任何建议?
更新:
这个非常奇怪:
- 分叉的redsharp,安装了json.net,工作正常
- 从reastharp fork复制休息类,粘贴到我的应用程序,使用它,工作正常
- 启动新项目,通过包管理器安装reasharp和json.net,工作正常
更新2: 调试通过叉式版本我注意到这一点:RequestFormat必须是dataformat.json,或者它将使用XML序列化器。但这并没有解决问题。我尝试将两个(只有两个)序列化器设置为null:
request.JsonSerializer = null;
request.XmlSerializer = null;
.
在新项目中,我这样做会导致按预期的nullreferrenceException。但在旧的中,没有任何反应。我尝试重命名变量,使另一个相同类型的变量,但没有任何修复。似乎在这个项目中,我有休息课程的课程是糟糕的。
我还向解决方案添加了一个新项目。即使是代码有效。所以它只是一个有问题的项目。
解决方案
由于您无法在新项目中重现它,因此在此特定项目中必须有不同的事情,这导致问题,您正在描述。
你可以尝试的几件事(没有特别的顺序):
-
检查您是否在两个项目中使用了与库中的完全相同的版本(有效的一个,并且它没有):包版和目标平台(Net4,Net35 ......)。
-
删除非工作项目的
packages
文件夹,以便强制核心核桃以重新下载所有包。 -
查找Visual Studio Propertial窗口中引用库的确切路径,当您选择的Referent节点中有reakarp时。在工作和非工作项目引用的库之间进行二进制比较。
不幸的是,在 symbolsource 中,没有符号包restsharp无法在非工作项目中直接调试RETSHARP。你可以使用反射器vspro 如果您有许可证或之前没有使用过试验。
-
将不工作项目的部分移动到工作,直到它停止工作。
编辑:
查看源代码