GSON फ़ील्ड्स का उपयोग क्यों करता है और गेटर्स / सेटर नहीं करता है?


79

GSON केवल फ़ील्ड (निजी, सार्वजनिक, संरक्षित) का उपयोग क्यों करता है ? क्या जीएसओएन को केवल गेटर्स और सेटर का उपयोग करने के बारे में बताने का कोई तरीका है?

जवाबों:


96

सामान्यतया जब आप किसी वस्तु को क्रमबद्ध / डिस्क्राइब करते हैं, तो आप वस्तु की स्थिति की सटीक प्रतिलिपि के साथ समाप्त करने के लिए ऐसा कर रहे हैं; जैसे, आप आम तौर पर OO डिज़ाइन में वांछित एनकैप्सुलेशन को दरकिनार करना चाहते हैं। यदि आप इनकैप्सुलेशन को दरकिनार नहीं करते हैं, तो एक ऑब्जेक्ट के साथ समाप्त करना संभव नहीं हो सकता है, जो कि डीरिएरलाइज़ेशन के बाद ठीक वैसी ही स्थिति है जैसा कि धारावाहिकीकरण से पहले था। इसके अतिरिक्त, उस मामले पर विचार करें जहां आप किसी विशेष संपत्ति के लिए एक सेटर प्रदान नहीं करना चाहते हैं। यदि आप गेटर्स और सेटर के माध्यम से काम कर रहे हैं तो धारावाहिकीकरण / विचलन कैसे होना चाहिए?


28
कैसे "परिकलित फ़ील्ड्स" के बारे में हम बाहरी दुनिया को प्रदान करना चाहेंगे? आपके सोचने के तरीके में, मुझे एक फ़ील्ड बनाना चाहिए और इस फ़ील्ड को हर बार अपडेट करना चाहिए जब मैं अपने POJO फ़ील्ड में से एक को अपडेट करूँ? उरग ...
17

2
@ Frédéric - मैं वास्तव में संपत्ति पाने वालों और क्रमबद्धता के लिए बसने के द्वारा शुरू की गई कठिनाइयों की ओर इशारा कर रहा हूं; परिकलित गुण अपनी समस्याओं के रूप में अच्छी तरह से पेश करेंगे। उदाहरण के लिए, यदि आप किसी को एक अनुक्रमित वस्तु देते हैं, तो वे गणना की गई संपत्ति के मूल्य को अपडेट करते हैं और इसे वापस आपके पास भेजते हैं, तो आवेदन को कैसे हटाना चाहिए? संपत्ति को अद्यतन नहीं किया गया था या अपवाद नहीं फेंका गया था? इसके अलावा, यदि वे उन संपत्तियों को अद्यतन करते हैं जिन पर गणना की गई संपत्ति आधारित थी, तो वस्तु स्थिति वास्तव में अमान्य है, और यह पढ़कर कि संपत्ति का मूल्य फ्लैट गलत है।
क्रिस शफ़र

1
मैं @ Frédéric से सहमत हूं; वहाँ कुछ किनारे मामले हैं जो गुण उप क्षेत्रों का उपयोग करके योग्यता रखते हैं। मैं बस एक में भाग गया, जहां मेरे पास एक वस्तु पर एक बाइट सरणी है जिसे मैं बाहर करना चाहूंगा और इसके बजाय एक स्ट्रिंग लौटाऊंगा। अब मैं डीटीओ के माध्यम से वस्तु को अपनाने के साथ बचा हुआ हूं।
रिचर्ड क्लेटन

परिकलित / व्युत्पन्न फ़ील्ड को लेबल किया जाना चाहिए transientताकि वे क्रमबद्ध न हों, और अनुरोध पर पुनर्गणना हो।
बोफिनब्रेन

14
यह ठीक है अगर उपयोग मामला जावा से जावा क्रमांकन है, लेकिन एक काफी सामान्य उपयोग का मामला है, जावा ऑब्जेक्ट को रिस्ट एपी कॉल के परिणामस्वरूप उजागर करना है, तो उस मामले में जावा पक्ष पर हमें दो तरह से सही क्रमांकन की आवश्यकता नहीं है, अधिक बार हम खेतों और क्रम को छिपाना चाहते हैं (और यदि आवश्यक हो तो / deserialise, विशिष्ट, अक्सर समय गणना की गई, गुण।
सिमोन गियानी

26

क्या जीएसओएन को केवल गेटर्स और सेटर का उपयोग करने के लिए बताने का कोई तरीका है?

अभी नहीं।

से डिज़ाइन दस्तावेज़ :

[टी] यहाँ गुणों का समर्थन करने के लिए अच्छे तर्क हैं। हम जसन क्षेत्रों को इंगित करने के लिए वैकल्पिक मानचित्रण के रूप में गुणों का समर्थन करने के लिए एक बाद के संस्करण में Gson को बढ़ाने का इरादा रखते हैं। अभी के लिए, Gson फ़ील्ड-आधारित है।


Getters और setters के लिए Gson समर्थन के संबंध में, मेलिंग सूची से इस पर नवीनतम अद्यतन है कि "[टी] वह इस तरह के एक सुविधा Gson में बनाने की संभावनाओं को काफी कम कर रहे हैं ..." है groups.google.com/forum/#!topic / google-gson / 4G6Lv9PghUY
प्रोग्रामर ब्रूस

मुझे नहीं लगता कि गेटर्स और सेटर का उपयोग नहीं करना चाहिए, क्रिस शेफ़र इस उत्तर में बहुत अच्छा बताते हैं।
संतरी

4
एक कस्टम सीरियलाइज़र / डिसेरिएलाइज़र लिखें, इस तरह से आप अपनी कक्षा में मानों को लिखने के लिए जिस भी तरीके का उपयोग करना चाहते हैं, कर सकते हैं।
डेव बर्च

2
यह उत्तर बहुत पुराना है, इस तरह के उत्तरों के लिए स्टैकओवरफ्लो को कुछ "गारबेज कलेक्टर" की आवश्यकता होती है।
अजीम

@ जेबी नप। उत्तर अभी भी मान्य है।
9ilsdx 9rvj 0lo


0

हमारे ऐप में यह कैसे काम करता है इसकी अस्पष्ट रूपरेखा है कि हमारे पास बहुत सारे TypeAdapterकार्यान्वयन हैं - कुछ विशिष्ट मूल्य जैसी वस्तुओं के लिए और कुछ बीन-स्टाइल ऑब्जेक्ट्स के लिए जहां हम जानते हैं कि JavaBeans लॉजिक काम करेगा। फिर हम ऑब्जेक्ट GsonBuilderबनाने से पहले इन सभी को जाम कर देते हैं Gson

दुर्भाग्य से, जीएसओएन वास्तव में जैसे प्रकार से निपटने में बकवास है Object[]। हमने ज्यादातर यह देखा जब हम विधि मापदंडों का प्रतिनिधित्व करने के लिए एक JSON ऑब्जेक्ट बनाने की कोशिश कर रहे थे। इसके लिए वर्कअराउंड कस्टम TypeAdapterइंस्टेंसेस बनाना था जो तरीकों को दर्शाते हैं। (इसका मतलब यह है कि आप Gsonकॉल करने का इरादा प्रति विधि एक उदाहरण का उपयोग करके समाप्त करते हैं ...)


आप कैसे समझदारी से ऑब्जेक्ट को डिसेर्बलाइजिंग करेंगे? आप यह कैसे अनुमान लगा सकते हैं कि इसे डिसेर्बलाइज करने के लिए क्या है?
9ilsdx 9rvj 0lo

ऑब्जेक्ट के लिए, या सामान्य रूप से बहुरूपी सामान के लिए, उनके पास संभवतः एक विशेषता रिकॉर्ड हो सकता है जो एडेप्टर मूल रूप से इसे क्रमबद्ध करता है। लेकिन स्मृति से, मुझे लगता है कि {"a", 2, "b"} जैसे स्पष्ट सामान भी वस्तु [] के प्रति उदासीन नहीं थे।
तर्जुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.