2011-06-01 5 views
64

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

उत्तर

81

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

+21

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

+1

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

+0

मैं @ फ्रैडेरिक से सहमत हूं; कुछ किनारे के मामले हैं जो गुण उपायों का उपयोग कर योग्यता रखते हैं। मैं बस उस स्थान पर भाग गया जहां मेरे पास एक ऑब्जेक्ट पर एक बाइट सरणी है जिसे मैं बाहर करना चाहता हूं और इसके बजाय एक स्ट्रिंग वापस करना चाहता हूं। अब मैं ऑब्जेक्ट को डीटीओ के माध्यम से अनुकूलित करने के साथ छोड़ दिया गया हूं। –

22

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

अभी तक नहीं।

the design doc से:

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

+0

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

+0

मुझे नहीं लगता कि getters और setters का उपयोग नहीं करना चाहिए, क्रिस शैफर इस सुंदर इस जवाब में अच्छा बताते हैं। – Sentry

+43

यह 3 साल बाद है। कोई सुधार? –

4

यह use getters को Gson पैच करने के लिए संभव है।

+1

मैं यह निर्धारित करने में सक्षम होना चाहता हूं कि कौन से चरों को गेटर और सेटर – CQM

0

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

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

+0

का उपयोग करना चाहिए ऑब्जेक्ट में किसी भी चीज़ को deserializing कैसे संवेदनापूर्वक संभालना होगा? आप यह अनुमान लगाना चाहेंगे कि इसे deserialize करने के लिए क्या है? –

+0

ऑब्जेक्ट के लिए, या सामान्य रूप से पॉलिमॉर्फिक सामान के लिए, उनके पास शायद एक विशेषता रिकॉर्ड हो सकता है जिसे एडाप्टर ने मूल रूप से क्रमबद्ध किया था। लेकिन स्मृति से, मुझे लगता है कि {"ए", 2, "बी"} जैसी स्पष्ट सामग्री भी ऑब्जेक्ट [] के लिए निराशाजनक नहीं थी। – Trejkaz

संबंधित मुद्दे