Gson এর Custom Type Adapter ব্যবহার করে আপনি polymorphism (অথবা বিভিন্ন ধরনের অবজেক্টের জন্য একই ধরনের ইন্টারফেস বা শ্রেণী) হ্যান্ডল করতে পারেন। polymorphism হ্যান্ডলিং তখন প্রয়োজন হয় যখন আপনার JSON ডাটা বিভিন্ন ধরনের অবজেক্ট ধারণ করে এবং আপনি চাইছেন যে Gson সেগুলিকে সঠিকভাবে ডেসিরিয়ালাইজ (পড়তে) ও সিরিয়ালাইজ (লিখতে) করতে পারে।
এটি সাধারনত বিভিন্ন ধরনের অবজেক্টের জন্য একই বেস ক্লাস বা ইন্টারফেস ব্যবহার করে JSON ডাটা তৈরি ও পড়ার সময় দরকার হয়। Gson এর ডিফল্ট ডেসিরিয়ালাইজেশন এবং সিরিয়ালাইজেশন পদ্ধতি polymorphic অবজেক্ট হ্যান্ডলিংয়ের জন্য প্রস্তুত নয়, তবে আপনি Custom Type Adapter তৈরি করে এটি হ্যান্ডল করতে পারেন।
উদাহরণ:
ধরা যাক, আপনার একটি বেস ক্লাস Animal আছে এবং তার দুটি সিড (derived) ক্লাস Dog এবং Cat রয়েছে। এইসব অবজেক্টের জন্য আপনাকে JSON স্ট্রাকচার হ্যান্ডল করতে হবে।
Step 1: বেস ক্লাস এবং derived ক্লাস তৈরি করা
class Animal {
String name;
public Animal(String name) {
this.name = name;
}
public String makeSound() {
return "Some sound";
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public String makeSound() {
return "Bark";
}
}
class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public String makeSound() {
return "Meow";
}
}
Step 2: Custom Type Adapter তৈরি করা
এখন, আপনাকে TypeAdapter তৈরি করতে হবে যাতে Dog এবং Cat অবজেক্টগুলো সঠিকভাবে ডেসিরিয়ালাইজ এবং সিরিয়ালাইজ হতে পারে।
import com.google.gson.*;
import java.lang.reflect.Type;
class AnimalAdapter implements JsonSerializer<Animal>, JsonDeserializer<Animal> {
@Override
public JsonElement serialize(Animal src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
// Serialize the common field (name)
jsonObject.addProperty("name", src.name);
// Serialize the specific fields depending on the subclass type
if (src instanceof Dog) {
jsonObject.addProperty("type", "dog");
jsonObject.addProperty("sound", src.makeSound());
} else if (src instanceof Cat) {
jsonObject.addProperty("type", "cat");
jsonObject.addProperty("sound", src.makeSound());
}
return jsonObject;
}
@Override
public Animal deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String name = jsonObject.get("name").getAsString();
String type = jsonObject.get("type").getAsString();
// Create the correct subclass instance based on the 'type' field in the JSON
if ("dog".equals(type)) {
return new Dog(name);
} else if ("cat".equals(type)) {
return new Cat(name);
} else {
throw new JsonParseException("Unknown type: " + type);
}
}
}
Step 3: GsonBuilder দিয়ে Custom TypeAdapter রেজিস্টার করা
এখন, GsonBuilder ব্যবহার করে কাস্টম TypeAdapter রেজিস্টার করতে হবে:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class PolymorphismWithGson {
public static void main(String[] args) {
// Create a Dog and a Cat instance
Animal dog = new Dog("Buddy");
Animal cat = new Cat("Whiskers");
// Create a Gson object with the custom TypeAdapter
Gson gson = new GsonBuilder()
.registerTypeAdapter(Animal.class, new AnimalAdapter())
.create();
// Serialize the Animal objects
String dogJson = gson.toJson(dog);
String catJson = gson.toJson(cat);
System.out.println("Serialized Dog: " + dogJson);
System.out.println("Serialized Cat: " + catJson);
// Deserialize the JSON back into Animal objects
Animal deserializedDog = gson.fromJson(dogJson, Animal.class);
Animal deserializedCat = gson.fromJson(catJson, Animal.class);
System.out.println("Deserialized Dog: " + deserializedDog.makeSound());
System.out.println("Deserialized Cat: " + deserializedCat.makeSound());
}
}
আউটপুট:
Serialized Dog: {"name":"Buddy","type":"dog","sound":"Bark"}
Serialized Cat: {"name":"Whiskers","type":"cat","sound":"Meow"}
Deserialized Dog: Bark
Deserialized Cat: Meow
ব্যাখ্যা:
- Custom TypeAdapter:
AnimalAdapterক্লাসটিJsonSerializerএবংJsonDeserializerইন্টারফেস ইমপ্লিমেন্ট করেছে।serializeমেথড: এখানেAnimalঅবজেক্টের ধরন (subclass) অনুযায়ী JSON স্ট্রাকচার তৈরি করা হচ্ছে।DogএবংCatএর জন্য আলাদা"type"ফিল্ড দেওয়া হচ্ছে।deserializeমেথড: এখানে JSON থেকে অবজেক্ট তৈরি করার সময়typeফিল্ডের মান দেখে সঠিক subclass (যেমনDogবাCat) নির্ধারণ করা হচ্ছে।
- GsonBuilder:
registerTypeAdapter(Animal.class, new AnimalAdapter())ব্যবহার করে আমরাAnimalক্লাসের জন্য কাস্টমTypeAdapterরেজিস্টার করেছি, যাতে Gson এর সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কাস্টম লজিক অনুসারে চলে। - Polymorphic Serialization & Deserialization:
- সিরিয়ালাইজেশনে,
DogএবংCatএর মধ্যে পার্থক্য করতে"type"ফিল্ড ব্যবহার করা হয়েছে। - ডেসিরিয়ালাইজেশনে,
"type"ফিল্ড দেখে সঠিক subclass নির্বাচন করা হয়েছে।
- সিরিয়ালাইজেশনে,
- Polymorphism হ্যান্ডল করতে Gson এর Custom Type Adapter খুবই শক্তিশালী একটি পদ্ধতি।
- আপনি যখন polymorphic অবজেক্টের জন্য JSON তৈরি বা JSON থেকে অবজেক্ট তৈরি করতে চান, তখন Custom TypeAdapter আপনাকে কাস্টম সিরিয়ালাইজেশন ও ডেসিরিয়ালাইজেশন লজিক প্রয়োগ করার সুযোগ দেয়।
- এটি বিশেষভাবে উপকারী যখন আপনার অবজেক্টের ধরন ডায়নামিকভাবে পরিবর্তিত হয় এবং Gson ডিফল্টভাবে এটি হ্যান্ডল করতে পারে না।
Read more