web-dev-qa-db-ja.com

androidのMoshi vs Gson

Moshi by square またはGsonを使用してモデルデータをシリアル化および非シリアル化するかどうかを決定します。

gsonについて私がいつも気に入らないことの1つは、Androidで低速になる可能性のあるリフレクションを使用していると思うことです。 Moshiはリフレクションも使用しますか?

Moshi vs Gsonの長所と短所は何ですか?

それらは似ていると思います。 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に切り替えた場合、パフォーマンスが向上するかどうかを確認しています。

57
j2emanue

MoshiはOkioを使用して、Gsonが実行しないいくつかのことを最適化します。

  • フィールド名の読み取り の場合、Moshiは文字列を割り当てたり、ハッシュルックアップを実行したりする必要はありません。
  • Moshiは入力をUTF-8バイトのシーケンスとしてスキャンし、Java charsに遅延変換します。たとえば、整数リテラルを文字に変換する必要はありません。

これらの最適化の利点は、すでにOkioストリームを使用している場合に特に顕著です。 Retrofit および OkHttp のユーザーは特にMoshiの恩恵を受けます。

Moshiの起源に関する詳細な議論は、私の投稿、 Moshi、別のJSONプロセッサ にあります。

75
Jesse Wilson

swankjesseのredditに関するコメント によると:

私はGsonでの仕事を誇りに思っていますが、Gsonの制限のいくつかにも失望しています。私はこれらに対処したかったのですが、「Gson 3.0」としてではなく、一部はGoogleで働いていないためです。 Jake、Scott、Eric、および私は、Gsonのさまざまな制限に対処するためにMoshiを作成しました。 GsonよりもMoshiを好む10の小さな理由を次に示します。

  1. 今後のKotlinサポート。

  2. @HexColor intのような修飾子は、単一のJava型に対して複数のJSON表現を許可します。

  3. @ToJsonと@FromJsonを使用すると、カスタムJSONアダプターを簡単に記述してテストできます。

  4. JsonAdapter.failOnUnknown()を使用すると、予期しないJSONデータを拒否できます。

  5. 予測可能な例外。 MoshiはIO問題でIOExceptionをスローし、型の不一致でJsonDataExceptionをスローします。 Gsonはいたるところにあります。

  6. JsonReader.selectName()は、一般的なケースで不必要なUTF-8デコードと文字列の割り当てを回避します。

  7. 小さいAPKを発送します。 Gsonは227 KiB、Moshi + Okioは合わせて200 KiBです。

  8. Moshiは、プラットフォームタイプの実装の詳細をエンコードされたJSONに漏らしません。これは私にGsonを恐れさせます:gson.toJson(SimpleTimeZone.getTimeZone( "GMT"))

  9. Moshiは、デフォルトでは奇妙なHTMLエスケープを行いません。例として、Gsonのデフォルトのエンコード「12&5 = 4」を見てください。

  10. 破損した日付アダプターはデフォルトでインストールされていません。

新しいコードを作成する場合は、Moshiから始めることを強くお勧めします。 Gsonを使用して既存のプロジェクトを作成している場合、それがシンプルでリスクのない場合はアップグレードする必要があります。それ以外の場合はGsonを使い続けてください!互換性と信頼性を維持するために最善を尽くしています。

12