नीचे दिया गया उदाहरण एक वर्ग (क्लब) दिखाता है जिसमें एक अमूर्त वर्ग (सदस्य) का संग्रह होता है। मैं इस बात से भ्रमित हूं कि मुझे Deserialization सही तरीके से काम करने के लिए टाइपएडाप्टर या जेसनडेसरियलज़र की आवश्यकता है या नहीं। सीरियलाइजेशन किसी भी मदद के बिना ठीक काम करता है, लेकिन Deserialization अपवाद फेंक रहा है। उदाहरण के लिए मैंने निम्नलिखित "क्लोन" परीक्षण बनाया है। यदि कोई कामकाजी उदाहरण दिखा सकता है तो मैं बहुत आभारी रहूंगा।जीसन प्रकार एडाप्टर बनाम कस्टम Deseralizer
पहले क्लब क्लास
package gson.test;
import java.util.ArrayList;
import com.google.gson.Gson;
public class Club {
public static void main(String[] args) {
// Setup a Club with 2 members
Club myClub = new Club();
myClub.addMember(new Silver());
myClub.addMember(new Gold());
// Serialize to JSON
Gson gson = new Gson();
String myJsonClub = gson.toJson(myClub);
System.out.println(myJsonClub);
// De-Serialize to Club
Club myNewClub = gson.fromJson(myJsonClub, Club.class);
System.out.println(myClub.equals(myNewClub) ? "Cloned!" : "Failed");
}
private String title = "MyClub";
private ArrayList<Member> members = new ArrayList<Member>();
public boolean equals(Club that) {
if (!this.title.equals(that.title)) return false;
for (int i=0; i<this.members.size(); i++) {
if (! this.getMember(i).equals(that.getMember(i))) return false;
}
return true;
}
public void addMember(Member newMember) { members.add(newMember); }
public Member getMember(int i) { return members.get(i); }
}
अब सार बेस कक्षा सदस्य
package gson.test;
public abstract class Member {
private int type;
private String name = "";
public int getType() { return type; }
public void setType(int type) { this.type = type; }
public boolean equals(Member that) {return this.name.equals(that.name);}
}
और (स्वर्ण और रजत) सदस्य के दो ठोस उप-वर्गों
package gson.test;
public class Gold extends Member {
private String goldData = "SomeGoldData";
public Gold() {
super();
this.setType(2);
}
public boolean equals(Gold that) {
return (super.equals(that) && this.goldData.equals(that.goldData));
}
}
package gson.test;
public class Silver extends Member {
private String silverData = "SomeSilverData";
public Silver() {
super();
this.setType(1);
}
public boolean equals(Silver that) {
return (super.equals(that) && this.silverData.equals(that.silverData));
}
}
और अंत में आउटपुट
{"title":"MyClub","members":[{"silverData":"SomeSilverData","type":1,"name":""},{"goldData":"SomeGoldData","type":2,"name":""}]}
Exception in thread "main" java.lang.RuntimeException: Failed to invoke public gson.test.Member() with no args
at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:107)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:186)
...
बराबर() विधि को 'ऑब्जेक्ट' पैरामीटर प्रकार लेना चाहिए, न कि 'क्लब' –
धन्यवाद, यह मुझे पकड़ने के लिए थोड़ा सा ले जाएगा। –
समझ गया, धन्यवाद, मैं अगली बार अप-वोट करूंगा। –