java - gson serialization and deserialization of an ArrayList -


मेरी सेट अप की तरह है:

  सार्वजनिक enum AnimalType {CAT (1), कुत्ता (2); निजी फाइनल इंट वैल्यू; एनिमल टाईप (इंट वैल्यू) {this.value = value; } सार्वजनिक पूर्ण मूल्य () {वापसी मूल्य; }} सार्वजनिक वर्ग डॉग {पशु प्रकार प्रकार = AnimalType.DOG; स्ट्रिंग का नाम; int आईडी; // अन्य गुण बिंदु यह एक बिल्ली वस्तु से अलग है } सार्वजनिक वर्ग की बिल्ली {AnimalType type = AnimalType.CAT; स्ट्रिंग का नाम; स्ट्रिंग रिक; इंट उम्र; } सार्वजनिक श्रेणी प्रतिक्रिया {ArrayList & lt; ऑब्जेक्ट & gt; myResponseObject; }   

यहां एक उदाहरण दिया गया है कि कैसे एक प्रतिक्रिया वस्तु दिखाई दे सकती है:

  ArrayList & lt; Object & gt; arr = नया ArrayList & lt; Object & gt; (); कुत्ता कुत्ता = नया कुत्ता ("माइनोम", 0); बिल्ली बिल्ली = नया कैट ("माइनोम", "माइनिकनाम", - 1); Arr.add ("मेरे पास है"); arr.add (बिल्ली) arr.add ("और"); arr.add (कुत्ता) प्रतिक्रिया प्रतिक्रिया = नया प्रतिक्रिया (arr);   

और मैं इस तरह से धारावाहिक रहा हूँ:

  जीएसन जीएसएन = नया जीएसन (); स्ट्रिंग सीरियलाइज्डऑप्टपुट = जीएसएन। टॉसन (प्रतिक्रिया);   

और इस तरह deserialize की उम्मीद है:

  // ArrayList & lt; ऑब्जेक्ट & gt; सही ढंग से इसके अंदर आबाद होना चाहिए? उत्तर deserializedObject = gson.fromJson (सीरियलकृतऑप्टपुट); हालांकि   

हालांकि, इस सूची को deserializing पर, मुझे ऑब्जेक्ट्स को उनके संबंधित प्रकारों पर वापस नक्शा करने की आवश्यकता है। मुझे संदेह है कि मुझे कक्षा या प्रकार को कुत्ते या बिल्ली के क्रमबद्धकरण में कम से कम टैग करना होगा। अभी के लिए, मैं डॉग एंड कैट पर एक प्रकार की संपत्ति (इंटरफ़ेस के बजाय) जोड़ रहा हूं।

कुछ फैंसी बिना, कैट और dog ऑब्जेक्ट्स हैं डिफ़ॉल्ट रूप से LinkedTreeMap & lt; K, V & gt; के रूप में माना जाता है जब deserialized मुझे मेरी सरणी सूची से पुनरावृति करना होगा, जांच लें कि क्या यह एक लिंक है LinkedTreeMap, टाइप करने के लिए "प्रकार" कुंजी को कॉल करें और फिर मेरी ऑब्जेक्ट को डॉग या कैट में डालें। यह सब सिर्फ मेरे लिए थोड़ा सा हैक लगता है, और मैं सोच रहा हूं कि ऐसा करने का एक और शानदार तरीका है।

क्या मैं अपने बिल्ली / डॉग ऑब्जेक्ट्स के लिए एक कस्टम सीरियलज़र / डिसेलाइलाइज़र का उपयोग कर रहा हूं या RuntimeTypeAdapterFactory जाने के लिए रास्ता? किसी भी मार्गदर्शन की सराहना की जाएगी।

ध्यान दें, मैं निर्देशों का पालन करके अपने enum कस्टम serializing / deserializing हूँ। मुझे यकीन नहीं है कि यह कुछ भी प्रभावित करता है।

धन्यवाद

यह कवर किया गया है उपयोगकर्ता मार्गदर्शिका में आप

करने की कोशिश कर रहे हैं जैसा कि वहाँ बताया गया है, आपके पास 3 विकल्प हैं:

विकल्प 1: जीएसएन के पार्सर एपीआई (निम्न स्तरीय स्ट्रीमिंग पार्सर या डोम पार्सर जेसनए पार्सर) का उपयोग करें सरणी तत्वों को पार्स करें और फिर प्रत्येक सरणी तत्वों पर Gson.fromJson () का उपयोग करें। यह पसंदीदा दृष्टिकोण है।

विकल्प 2: Collection.class के लिए एक प्रकार का एडाप्टर पंजीकृत करें जो प्रत्येक सरणी सदस्यों को देखता है और उन्हें उपयुक्त वस्तुओं के लिए नक्शे करता है। इस दृष्टिकोण का नुकसान यह है कि यह जीएसओ में अन्य संग्रह प्रकारों के deserialization को स्क्रू करेगा।

विकल्प 3: MyCollectionMemberType के लिए एक प्रकार के एडाप्टर को पंजीकृत करें और संग्रह के साथ जेसन से उपयोग करें & lt; MyCollectionMemberType & gt; यह दृष्टिकोण व्यावहारिक है यदि सरणी एक शीर्ष-स्तरीय तत्व के रूप में प्रकट होती है या यदि आप संग्रह को प्रकार संग्रह में रखने वाले फ़ील्ड प्रकार को बदल सकते हैं, तो संग्रह & lt; MyCollectionMemberType & gt;।

यह एक कठिन स्वचालित deserialization के बारे में बात करते समय समस्या इसके अलावा, विकल्प 3 आपके मामले में संभव नहीं है क्योंकि जैसा कि आप ऑब्जेक्ट का उपयोग कर रहे हैं डॉग और Cat से कुछ आधार वर्ग (जैसे पशु )।

उस के ऊपर ... आप ऑब्जेक्ट्स की उस सरणी के साथ कुछ बहुत ही अजीब कर रहे हैं, इसमें स्ट्रिंग s भी चिपके हुए हैं कुल मिलाकर, अगर यह कुछ प्रतिक्रिया है जो आप स्वयं पैदा कर रहे हैं ... मैं गंभीरता से सोचता हूं कि आप उस पर कैसे पहुंच रहे हैं।

Comments

Popular posts from this blog

Verilog Error: output or inout port "Q" must be connected to a structural net expression -

jasper reports - How to center align barcode using jasperreports and barcode4j -

c# - ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value -