Я решаю, использовать ли 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.

78
j2emanue 24 Апр 2017 в 02:28

2 ответа

Лучший ответ

Моши использует Okio для оптимизации нескольких вещей, которые не делает Gson.

  • Когда чтение имен полей, Моши не нужно выделять строки или выполнять поиск по хешу.
  • Moshi сканирует входные данные в виде последовательности байтов UTF-8, лениво преобразуя их в символы Java. Например, ему никогда не нужно преобразовывать целочисленные литералы в символы.

Преимущества этих оптимизаций особенно заметны, если вы уже используете потоки Okio. Пользователи модернизации и OkHttp особенно полезен для Moshi.

Дальнейшее обсуждение происхождения Моши есть в моем посте, Моши, другой Процессор JSON.

93
Jesse Wilson 24 Апр 2017 в 02:09

Из предыдущей ссылки вы можете видеть, что использование 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 с валидациями для обеспечения допустимости свойств модели.

0
Herman 10 Мар 2020 в 22:46