Я решаю, использовать ли Moshi by square или Gson для сериализации и десериализации данных модели.
Одна вещь, которая мне всегда не нравилась в Gson - я думаю, что она использует отражение, которое может быть медленным на Android? Моши тоже использует отражение?
Каковы некоторые плюсы и минусы Моши против Гсона?
Я вижу их как похожие. Возьмем, к примеру, это утверждение, которое создает typeAdapter:
class CardAdapter {
@ToJson String toJson(Card card) {
return card.rank + card.suit.name().substring(0, 1);
}
@FromJson Card fromJson(String card) {
if (card.length() != 2) throw new JsonDataException("Unknown card: " + card);
char rank = card.charAt(0);
switch (card.charAt(1)) {
case 'C': return new Card(rank, Suit.CLUBS);
case 'D': return new Card(rank, Suit.DIAMONDS);
case 'H': return new Card(rank, Suit.HEARTS);
case 'S': return new Card(rank, Suit.SPADES);
default: throw new JsonDataException("unknown suit: " + card);
}
}
}
И использовать его, зарегистрируйте его, как в gson:
Moshi moshi = new Moshi.Builder()
.add(new CardAdapter())
.build();
Я предполагаю, что преимуществами будут аннотации, используемые в typeAdapter. Я хочу выяснить, есть ли какие-либо улучшения производительности, если я переключусь на Moshi.
2 ответа
Моши использует Okio для оптимизации нескольких вещей, которые не делает Gson.
- Когда чтение имен полей, Моши не нужно выделять строки или выполнять поиск по хешу.
- Moshi сканирует входные данные в виде последовательности байтов UTF-8, лениво преобразуя их в символы Java. Например, ему никогда не нужно преобразовывать целочисленные литералы в символы.
Преимущества этих оптимизаций особенно заметны, если вы уже используете потоки Okio. Пользователи модернизации и OkHttp особенно полезен для Moshi.
Дальнейшее обсуждение происхождения Моши есть в моем посте, Моши, другой Процессор JSON.
Из предыдущей ссылки вы можете видеть, что использование moshi codegen создаст адаптеры времени компиляции для классов модели, что исключит использование отражения во время выполнения
Модель
@JsonClass(generateAdapter = true)
class MyModel(val blah: Blah, val blah2: Blah)
Приложение / build.gradle
kapt "com.squareup.moshi:moshi-kotlin-codegen:$version_moshi"
Сгенерирует класс MyModelJsonAdapter с валидациями для обеспечения допустимости свойств модели.
Связанные вопросы
Новые вопросы
android
Android - это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфоны, планшеты, автомобили, телевизоры, одежда, стекло, IoT). Для тем, связанных с Android, используйте специальные теги Android, такие как android-intent, android-activity, android-адаптер и т. Д. Для вопросов, не связанных с разработкой или программированием, но связанных с платформой Android, используйте эту ссылку: https: // android.stackexchange.com .