Расширение сериализации RestSharp с помощью проблемы с пользовательским сериализатором
-
23-12-2019 - |
Вопрос
Я пытаюсь улучшить сериализацию RestSharp по умолчанию, используя библиотеку Json.net.Чтобы настроить сериализацию, вам необходимо реализовать интерфейс 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);
Все работает, за исключением того, что свойства не в нижнем регистре.При отладке отладчик обращается к конструктору сериализаторов, но его метод никогда не вызывается.Когда я попробовал то же самое для десериализации (интерфейс 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);
Что я заметил в последних двух:если у меня есть свойства в нижнем регистре и я разрешаю сериализацию RestSharp, тогда запрос будет иметь 5 параметров (по одному для каждого свойства).Если я добавлю его с помощью двух верхних методов, у него будет только одно свойство, и это весь json.
Я проверяю проблемы RestSharp, но безрезультатно.Какие-либо предложения?
Обновлять:
Это очень странно:
- разветвил RestSharp, установил Json.net, работает нормально
- скопировал класс RestRequest из вилки RestSharp, вставил в свое приложение, использовал его, работает нормально
- запустил новый проект, установил RestSharp и Json.net через диспетчер пакетов, работает нормально
Потом удалил все пакеты из основного приложения, скачал заново, не работает.Типа отказываюсь от этого.
Обновление 2:Отлаживая разветвленную версию, я заметил следующее:RequestFormat должен быть Dataformat.Json, иначе будет использоваться сериализатор Xml.Но это не решает проблему.Я попытался установить для обоих (их только два) сериализаторов значение null:
request.JsonSerializer = null;
request.XmlSerializer = null;
В новом проекте, который я сделал, это вызывает исключение NullReferrenceException, как и ожидалось.А в старом ничего не происходит.Я пробовал переименовывать переменные, создавая еще одну переменную того же типа, но ничего не исправляется.Просто кажется, что в проекте у меня класс RestRequest как-то глючит.
Я также добавил в решение новый проект.И даже там код работает.Так что это только один проект, в котором есть проблема.
Решение
Поскольку вы не можете воспроизвести это в новом проекте, в этом конкретном проекте должно происходить что-то другое, что и вызывает проблемы, которые вы описываете.
Несколько вещей, которые вы могли бы попробовать (в произвольном порядке):
Убедитесь, что вы используете одну и ту же версию библиотеки в обоих проектах (ту, которая работает, и ту, которая нет):версия пакета и целевая платформа (net4, net35...).
Удалить
packages
папку вашего нерабочего проекта, чтобы NuGet был вынужден повторно загрузить все пакеты.Найдите точный путь к указанной библиотеке в окне свойств Visual Studio, если выбран узел RestSharp из ссылок.Выполните бинарное сравнение библиотек, на которые ссылается рабочий и нерабочий проект.
К сожалению, для RestSharp нет пакета символов. СимволИсточник, поэтому вы не можете напрямую отлаживать RestSharp в своем нерабочем проекте.Вы могли бы использовать Рефлектор.NET VSPro если у вас есть лицензия или вы еще не использовали пробную версию.
Перемещайте части вашего неработающего проекта в рабочий до тех пор, пока он не перестанет работать.
РЕДАКТИРОВАТЬ:
Глядя на исходный код из RestRequest
, AddObject
кажется, не использует JsonSerializer
ты ставишь.Вы пробовали использовать AddBody
вместо?