Расширение сериализации RestSharp с помощью проблемы с пользовательским сериализатором

StackOverflow https://stackoverflow.com//questions/25066992

Вопрос

Я пытаюсь улучшить сериализацию 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 вместо?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top