Как GSON создает экземпляр класса конструктора no-zero-arg? [Дубликат]

Короткий ответ: вам нужно выполнить обратный вызов следующим образом:

function callback(response) {
    // Here you can do what ever you want with the response object.
    console.log(response);
}

$.ajax({
    url: "...",
    success: callback
});
44
задан raindev 20 March 2015 в 15:45
поделиться

2 ответа

As of Gson 2.3.1.

Независимо от того, что говорит документация Gson, если ваш класс не имеет конструктора no-args, и вы не зарегистрировали никаких объектов InstanceCreater, то это создаст объект ObjectConstructor (который строит ваш объект) с помощью UnsafeAllocator, который использует Reflection для получения метода allocateInstance класса sun.misc.Unsafe для создания экземпляра вашего класса.

Этот Unsafe класс обходит отсутствие конструктора no-args и имеет много других опасных применений . allocateInstance states

Выделить экземпляр, но не запускать какой-либо конструктор. Инициализирует класс, если он еще не был.

Так что на самом деле он не нужен конструктор и обойдет ваш два конструктора аргументов. См. Некоторые примеры здесь .

Если у вас есть конструктор no-args, Gson будет использовать ObjectConstructor, который использует это значение по умолчанию Constructor, вызывая

yourClassType.getDeclaredConstructor(); // ie. empty, no-args

Мои 2 цента: следуйте тому, что говорит Gson, и создайте свои классы с помощью конструктора no-arg или зарегистрируйте InstanceCreator. Вы можете оказаться в плохом положении, используя Unsafe.

75
ответ дан Community 27 August 2018 в 07:07
поделиться

В библиотеке Jackson есть хорошее решение, как описано здесь:

https://stackoverflow.com/a/11838468/2854723

Цель состоит в том, чтобы сообщить сериализатору через функцию Mix-Ins , какие поля JSON использовать при использовании конструктора с аргументами.

Если этот объект часть внешней библиотеки, тогда вы можете «удаленно аннотировать» с помощью функции Creator .

1
ответ дан turbanoff 27 August 2018 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: