java - GSON: serialize/deserialize object of class, that have registered type hierarchy adapter, using ReflectiveTypeAdapterFactory.Adapter -


स्पष्ट होने के लिए, कुछ मॉडल को घुसाना:

  इंटरफ़ेस ए {बूलीयन है सोमेकेज (); } क्लास एएडैप्टर JsonSerializer को लागू करता है & lt; A & gt; {सार्वजनिक जेएसनएलेमेंट सीरियललाइज़ (एक स्रोत, प्रकार प्रकार ओफ़एसआरसी, जेएसओएनएसरिअलाइजेशन कॉन्टैक्ट संदर्भ) {अगर (एसआरसी। सोमेकेज ()) {/ * कुछ तर्क * / रिटर्न परिणाम; } और {JsonObject json = नया JsonObject (); जेसनईलेमेंट वैल्यूजसन = & lt; ??? & gt ;; // TODO serialize src जैसे पॉजो जेसन.एड (src.getClass ()। GetSimpleName (), valueJson); वापसी json; }}} जीएसन जीएसएन = नया जीएसओएनबीइल्डर ()। पंजीयक टाइप हायरार्की एडेप्टर (ए। क्लास। नया एएडैप्टर ()) .create ();   

के कुछ उदाहरण को सच्चाई कैसे संभव है, जो है सोमेकेज () = false , किसी अन्य ऑब्जेक्ट की तरह, जो ReflectiveTypeAdapterFactory.Adapter

आप एक कस्टम लिख सकते हैं और आने वाले ऑब्जेक्ट के isSomeCase () के परिणाम को संभाल सकते हैं लिखते हैं () विधि और वहां अपना तर्क लागू करें:

  सार्वजनिक श्रेणी एटीपीएडैप्टरफैक्चरर लागू करने के लिए TypeAdapterFactory {सार्वजनिक प्रकार एडेप्टर & lt; A & gt; बनाओ (जीएसन जीएसएन, टाइपटोकन प्रकार) (यदि (! एवलैस.आईएसएएसएसग्नेबलफ्रॉम् (टाइप.गेटआरॉटीप ())) // जांचें कि आने वाले कच्चे टाइप एक इंटरफ़ेस रिटर्न बातिल का उदाहरण है; } अंतिम प्रकारएडैप्टर & lt; A & gt; Delegate = gson.getDelegateAdapter (यह, प्रकार); नया प्रकार एडेप्टर वापस लौटाएं & lt; ए & gt; () {@ ओवरराइड पब्लिक वॉअइड लिस्ट (जेसनउर्फर आउट, ए वैल्यू) IOException फेंकता है {if (value.isSomeCase ()) {// आपका कस्टम लॉजिक यहां बाहर है। बीबीआई ऑब्जेक्ट (); । Out.name ( "x") मूल्य (0); out.endObject (); } Else {// डिफ़ॉल्ट सीरियलाइजेशन यहाँ delegate.write (बाहर, मान); }} @ ओवरराइड पब्लिक ए पढें (जेसनरीडर में) IOException फेंकता है {रिटर्न प्रतिनिधि। रीड (इन); }}; }}  

टेस्ट:

  अंतिम जीएसएन्यूबिल्डर gsonbuilder = नया GsonBuilder (); // कस्टम प्रकार एडाप्टर फ़ैक्टरी पंजीकृत करें gsonbuilder.registerTypeAdapterFactory (नया एटीपीएडाप्टरफैक्चररी ()); अंतिम जीएसन जीएसएन = जीसनइबिल्डर.सेंट (); एक aSomeCaseTrue = नया एआईएमपीएल (सच); System.out.print ("aSomeCaseTrue:" + gson.toJson (aSomeCaseTrue)); // लिखता है; ASomeCaseTrue: {"x": 0} एक aomeCaseFalse = नया एआईएमपीएल (गलत); System.out.print ("aSomeCaseFalse:" + gson.toJson (aSomeCaseFalse);); // लिखता है; ASomeCaseFalse: {"someCase": false}  

अतिरिक्त:

1) आपका इंटरफ़ेस:

  इंटरफ़ेस ए {बूलीयन है सोमेकेज (); }  

2) एक नमूना वर्ग जो आपके नमूना इंटरफ़ेस को कार्यान्वित करता है:

  वर्ग एआईएमपीएल एक {बूलियन कुछ केस लागू करता है; सार्वजनिक एआईएमपीएल (बूलियन मान) {this.someCase = value; } @ ओवरराइड पब्लिक बूलियन सोमेकेज () {कुछ कैस लौटें; }}  

Comments