Android में मोशी बनाम गसन [बंद]


81

मैं इस बात का निर्णय कर रहा हूं कि मॉडल डेटा को क्रमबद्ध और डिस्क्रिअलाइज़ करने के लिए स्क्वायर या गॉन द्वारा मोशी का उपयोग करना है या नहीं।

एक बात मुझे हमेशा 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();

मुझे लगता है कि फायदे के प्रकार में इस्तेमाल किया जा रहा एनोटेशन होगा। अगर मुझे मोशी पर स्विच करना है तो मुझे यह पता लगाना है कि कोई प्रदर्शन लाभ है या नहीं।

जवाबों:


94

मोशी कुछ चीजों को अनुकूलित करने के लिए ओकिओ का उपयोग करता है जो कि गसन नहीं करता है।

  • फ़ील्ड नामों को पढ़ते समय , मोशी को तार आवंटित करने या हैश लुकअप करने की आवश्यकता नहीं होती है।
  • मोशी ने इनपुट को UTF-8 बाइट्स के अनुक्रम के रूप में स्कैन किया है, जो जावा चार्ट को लज़ीली रूपांतरित करता है। उदाहरण के लिए, पूर्णांक शाब्दिकों को वर्णों में बदलने की आवश्यकता नहीं है।

यदि आप पहले से ही Okio स्ट्रीम का उपयोग कर रहे हैं, तो इन अनुकूलन के लाभों का विशेष रूप से उच्चारण किया जाता है। मोशी से विशेष लाभ में रेट्रोफिट और ओकेहटप के उपयोगकर्ता ।

मोशी की उत्पत्ति पर आगे की चर्चा मेरे पोस्ट, मोशी, एक और JSON प्रोसेसर में है


क्या यह प्रतिबिंब का उपयोग करता है
j2emanue

2
@ j2emanue कार्यान्वयन विवरण के रूप में, आपकी कस्टम कक्षाओं के लिए डिफ़ॉल्ट JsonAdapters प्रतिबिंब के साथ फ़ील्ड सेट करेगा।
एरिक कोचरन

1
@ j2emanue प्रतिबिंब को कोडेन github.com/square/moshi#codegen
पेड्रो लोप्स

35

Reddit पर स्वंजेसे की टिप्पणी के अनुसार :

मुझे Gson पर अपने काम पर गर्व है, लेकिन इसकी कुछ सीमाओं से भी निराश हूं। मैं इन्हें संबोधित करना चाहता था, लेकिन भाग के रूप में "Gson 3.0" नहीं, क्योंकि मैं अब Google में काम नहीं करता। जेक, स्कॉट, एरिक, और मैंने गेसन की विभिन्न सीमाओं को संबोधित करने के लिए मोशी बनाई। गसन पर मोशी को पसंद करने के दस छोटे कारण यहां दिए गए हैं:

  1. आगामी कोटलिन समर्थन।

  2. @HexColor int जैसे क्वालिफायर एकल जावा प्रकार के लिए कई JSON अभ्यावेदन की अनुमति देते हैं।

  3. @ToJson और @FromJson ने कस्टम JSON एडेप्टर लिखना और परीक्षण करना आसान बना दिया है।

  4. JsonAdapter.failOnUnogn () आपको अनपेक्षित JSON डेटा को अस्वीकार करने देता है।

  5. अपवादस्वरूप अपवाद। मोशी IO समस्याओं पर IOException और टाइप बेमेल पर JsonDataException फेंकता है। सब जगह गसन है।

  6. JsonReader.selectName () आम मामले में अनावश्यक UTF-8 डीकोडिंग और स्ट्रिंग आवंटन से बचा जाता है।

  7. आप एक छोटा सा APK जहाज करेंगे। गेसन 227 KiB, मोशी + Okio एक साथ 200 KiB हैं।

  8. मोशी आपके एन्कोडेड JSON में प्लेटफॉर्म प्रकारों के कार्यान्वयन विवरणों को लीक नहीं करेगा। इससे मुझे Gson से डर लगता है: gson.toJson (SimpleTimeZone.getTimeZone ("GMT"))

  9. मोशी अजीब HTML डिफ़ॉल्ट रूप से भागने नहीं करता है। उदाहरण के लिए "12 और 5 = 4" के गॉन के डिफ़ॉल्ट एन्कोडिंग को देखें।

  10. डिफ़ॉल्ट रूप से कोई टूटा दिनांक एडॉप्टर स्थापित नहीं किया गया है।

यदि आप नया कोड लिख रहे हैं, तो मैं मोशी से शुरू करने की सलाह देता हूं। यदि आपको Gson के साथ एक मौजूदा प्रोजेक्ट मिला है, तो आपको अपग्रेड करना चाहिए यदि वह सरल होगा और जोखिम भरा नहीं होगा। अन्यथा Gson के साथ रहना! मैं यह सुनिश्चित करने के लिए अपनी पूरी कोशिश कर रहा हूं कि यह संगत और भरोसेमंद रहे।


1

पिछले लिंक से आप देख सकते हैं कि मोशी कोडगेन का उपयोग करने से मॉडल कक्षाओं के लिए संकलन समय एडेप्टर बन जाएगा, जो रनटाइम में प्रतिबिंब के उपयोग को हटा देगा।

नमूना

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

app / build.gradle

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

मॉडल गुणों की अशक्तता सुनिश्चित करने के लिए सत्यापन के साथ एक MyModelJsonAdapter वर्ग उत्पन्न करेगा।


आपको नहीं लगेगा कि मोशी तब और तेज है?
j2emanue
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.