Moshi vs Gson in android [닫기]


81

모델 데이터를 직렬화 및 역 직렬화 하는 데 Moshi by square 를 사용할지 Gson을 사용할지 결정하고 있습니다 .

내가 항상 Gson에 대해 좋아하지 않았던 점은 안드로이드에서 느릴 수있는 반사를 사용한다고 생각한다는 것입니다. Moshi도 반사를 사용합니까?

moshi 대 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로 전환하면 성능이 향상되는지 알아 보려고합니다.

답변:


94

Moshi는 Okio를 사용하여 Gson이하지 않는 몇 가지를 최적화합니다.

  • 필드 이름을 읽을 때 Moshi는 문자열을 할당하거나 해시 조회를 수행 할 필요가 없습니다.
  • Moshi는 입력을 UTF-8 바이트 시퀀스로 스캔하여 느리게 Java 문자로 변환합니다. 예를 들어 정수 리터럴을 문자로 변환 할 필요가 없습니다.

이러한 최적화의 이점은 이미 Okio 스트림을 사용하고있는 경우 특히 두드러집니다. 특히 RetrofitOkHttp 사용자는 Moshi의 혜택을받습니다.

Moshi의 기원에 대한 추가 논의는 내 게시물 Moshi, 또 다른 JSON 프로세서에 있습니다.


그것은 반사 사용 하는가
j2emanue

2
@ j2emanue 구현 세부 사항으로 사용자 정의 클래스의 기본 JsonAdapters는 리플렉션을 사용하여 필드를 설정합니다.
에릭 코크란

1
@ j2emanue 반사는 CODEGEN의 사용에 의해 피할 수 github.com/square/moshi#codegen을
페드로 로페스를

35

reddit 에 대한 swankjesse의 의견에 따르면 :

저는 Gson에 대한 제 작업이 자랑 스럽지만 그 한계에 실망했습니다. 부분적으로는 더 이상 Google에서 일하지 않기 때문에이 문제를 해결하고 싶었지만 "Gson 3.0"은 아닙니다. 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은 227KiB, Moshi + Okio는 합쳐서 200KiB입니다.

  8. Moshi는 플랫폼 유형의 구현 세부 사항을 인코딩 된 JSON으로 유출하지 않습니다. 이로 인해 Gson이 두렵습니다. gson.toJson (SimpleTimeZone.getTimeZone ( "GMT"))

  9. Moshi는 기본적으로 이상한 HTML 이스케이프를 수행하지 않습니다. 예를 들어 Gson의 기본 인코딩 인 "12 & 5 = 4"를보십시오.

  10. 기본적으로 설치된 손상된 날짜 어댑터가 없습니다.

새 코드를 작성하는 경우 Moshi로 시작하는 것이 좋습니다. Gson에 기존 프로젝트가있는 경우 간단하고 위험하지 않은 경우 업그레이드해야합니다. 그렇지 않으면 Gson을 고수하십시오! 호환성과 신뢰성을 유지하기 위해 최선을 다하고 있습니다.


1

이전 링크에서 moshi codegen을 사용하면 모델 클래스에 대한 컴파일 시간 어댑터가 생성되어 런타임에서 리플렉션 사용이 제거됨을 알 수 있습니다.

모델

@JsonClass(generateAdapter = true) 
class MyModel(val blah: Blah, val blah2: Blah)

app / build.gradle

kapt "com.squareup.moshi:moshi-kotlin-codegen:$version_moshi"

모델 속성의 nullablility를 보장하기 위해 유효성 검사와 함께 MyModelJsonAdapter 클래스를 생성합니다.


moshi가 더 빠르다고 생각하지 않습니까?
j2emanue
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.