2017-04-23 8 views
23

Moshi by square 또는 Gson을 사용하여 모델 데이터를 직렬화 및 비 직렬화 할 것인지 결정합니다.android에서 Moshi Gsson

내가 항상 Gson에 대해 좋아하지 않는 한 가지는 안드로이드에서 느려질 수있는 반사 작용을 사용한다고 생각 하나? Moshi는 리플렉션을 사용합니까?

moshi vs Gson의 장단점은 무엇입니까?

나는 그것들을 비슷하게 보았다.

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에서처럼 등록 사용 : 예를 들어 typeAdapter을 만들고이 문을

Moshi moshi = new Moshi.Builder() 
.add(new CardAdapter()) 
.build(); 

난 장점이 typeAdapter에 사용되는 주석이 될 것 같아요. 내가 Moshi로 전환하면 성능 향상이 있는지 찾아보고 있습니다.

답변

35

모시는 Okson을 사용하여 Gson이 최적화하지 않은 몇 가지 사항을 최적화합니다.

  • reading field names 인 경우 Moshi는 문자열을 할당하거나 해시 조회를 수행 할 필요가 없습니다.
  • Moshi는 입력을 Java 문자로 지연 변환하여 UTF-8 바이트 시퀀스로 검사합니다. 예를 들어 정수 리터럴을 문자로 변환 할 필요가 없습니다.

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

Moshi의 기원에 대한 자세한 논의는 내 게시물 Moshi, another JSON Processor에 있습니다.

+0

리플렉션을 사용합니까? – j2emanue

+2

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