Gson এর Runtime Type Adapter একটি শক্তিশালী ফিচার যা আপনি যখন polymorphic (অথবা inheritance-based) ডেটা মডেল ব্যবহার করেন তখন কাজে আসে। এটি আপনাকে একাধিক ক্লাসের মধ্যে serialization/deserialization করার জন্য একই টাইপ বা superclass ব্যবহার করতে সহায়তা করে। মূলত, এটি টাইপ ইনফরমেশন সংরক্ষণ করতে এবং ডাইনামিকভাবে টাইপ চিহ্নিত করতে সাহায্য করে, যা polymorphic অবজেক্টের রূপান্তর সহজ করে।
এটি আপনাকে different subtypes (যেমন parent class এবং child class) এর মধ্যে কাজ করতে সাহায্য করে। এটি তখন কার্যকরী হয় যখন আপনাকে superclass অথবা interface এর মাধ্যমে বিভিন্ন subtype টাইপকে serialize বা deserialize করতে হয়।
Runtime Type Adapter এর ব্যবহার:
গোস্ট্রিং (Gson) RuntimeTypeAdapterFactory ক্লাস ব্যবহার করে এটি সঞ্চালিত হয়। এই ক্লাসের মাধ্যমে আপনি বিভিন্ন subtype এর জন্য serialization/deserialization কাস্টমাইজ করতে পারেন।
উদাহরণ:
ধরা যাক আমাদের একটি polymorphic ক্লাস হায়ারার্কি আছে, যেখানে Animal হচ্ছে superclass এবং Dog এবং Cat হচ্ছে subclass।
Step 1: Define the classes (Parent & Child classes)
// Superclass
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void makeSound();
}
// Subclass - Dog
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
// Subclass - Cat
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("Meow!");
}
}
Step 2: Create the RuntimeTypeAdapterFactory
এখন, RuntimeTypeAdapterFactory ব্যবহার করে আমরা subclass গুলোর জন্য একটি কাস্টম সিরিয়ালাইজার/ডিজিরিয়ালাইজার তৈরি করব, যাতে Gson runtime এ এই subclasses গুলিকে ঠিকভাবে serialize/deserialze করতে পারে।
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
public class Main {
public static void main(String[] args) {
// GsonBuilder দিয়ে RuntimeTypeAdapterFactory সেট করা
RuntimeTypeAdapterFactory<Animal> animalAdapter = RuntimeTypeAdapterFactory
.of(Animal.class) // Animal ক্লাসকে ডিফাইন করা
.registerSubtype(Dog.class, "dog") // Dog ক্লাসের জন্য identifier "dog"
.registerSubtype(Cat.class, "cat"); // Cat ক্লাসের জন্য identifier "cat"
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(animalAdapter) // Gson এ adapter অ্যাড করা
.create();
// Create Animal objects
Animal dog = new Dog("Buddy");
Animal cat = new Cat("Whiskers");
// Serialize the objects
String dogJson = gson.toJson(dog);
String catJson = gson.toJson(cat);
System.out.println("Serialized Dog: " + dogJson); // {"type":"dog","name":"Buddy"}
System.out.println("Serialized Cat: " + catJson); // {"type":"cat","name":"Whiskers"}
// Deserialize back to objects
Animal deserializedDog = gson.fromJson(dogJson, Animal.class);
Animal deserializedCat = gson.fromJson(catJson, Animal.class);
// Call the method to see the result
deserializedDog.makeSound(); // Output: Woof!
deserializedCat.makeSound(); // Output: Meow!
}
}
Output:
Serialized Dog: {"type":"dog","name":"Buddy"}
Serialized Cat: {"type":"cat","name":"Whiskers"}
Woof!
Meow!
RuntimeTypeAdapter এর কার্যকারিতা:
- Polymorphic Serialization/Deserialization:
- Gson runtime টাইপ ইনফরমেশন সংরক্ষণ করে এবং বিভিন্ন subtype গুলি serializable করে, তাদের কাস্টম
typeমান দিয়ে। এইভাবে যখন আপনি একটি superclass টাইপের অবজেক্ট serialize বা deserialize করেন, তখন Gson সেই superclass এর subtype নির্ধারণ করে সঠিক subclass এ রূপান্তর করতে পারে।
- Gson runtime টাইপ ইনফরমেশন সংরক্ষণ করে এবং বিভিন্ন subtype গুলি serializable করে, তাদের কাস্টম
- Subtypes Registering:
- আপনি কাস্টম RuntimeTypeAdapterFactory ব্যবহার করে গ্যাপের মধ্যে subtype গুলোকে register করতে পারেন। এর ফলে আপনি নির্দিষ্ট identifier দিয়ে subtype গুলির জন্য serialization/deserialization সঠিকভাবে নির্ধারণ করতে পারেন।
- Type Safety:
- এটি type safety নিশ্চিত করে, কারণ subtype এর জন্য
typeফিল্ডের মান পরীক্ষা করে Gson সঠিক class এ ডেটা deserialize করতে পারে।
- এটি type safety নিশ্চিত করে, কারণ subtype এর জন্য
- Dynamic and Flexible:
- এটা খুবই ডাইনামিক, কারণ আপনি runtime-এ যে কোনো সংখ্যক subtype গুলোকে register করতে পারেন, এবং Gson সেই অনুযায়ী তাদের সঠিকভাবে handle করবে।
- Reducing Type Inference Problems:
- যখন polymorphic টাইপ হ্যান্ডল করা হয়, তখন runtime টাইপ চিহ্নিত করতে type adapters ব্যবহার করে এই সমস্যা সমাধান করা সম্ভব হয়। Gson কোড লেখার সময়ে টাইপগুলো সঠিকভাবে চিহ্নিত করতে পারে।
কোথায় ব্যবহার করবেন?
- Polymorphic Models: যেখানে superclass এবং subclass গুলো একসাথে ব্যবহার হয়। উদাহরণস্বরূপ, বিভিন্ন ধরনের শিফট বা কাজের প্রকারভেদ।
- API Response Handling: যখন আপনি একটি API এর মাধ্যমে polymorphic ডেটা ব্যবহার করছেন এবং আপনি নিশ্চিত নন যে API থেকে কোন ধরনের অবজেক্ট আসবে।
- JSON Web Tokens (JWT): যেখানে কিছু ক্ষেত্রের ডেটা polymorphic থাকতে পারে এবং এটি deserialize করার জন্য runtime type adapter ব্যবহার করা যায়।
Gson এর RuntimeTypeAdapter ফিচার polymorphic ডেটা হ্যান্ডল করার জন্য অত্যন্ত কার্যকরী। এটি টাইপ সেফটি, flexibility, এবং polymorphic অবজেক্টের সাথে কাজ করার জন্য একটি শক্তিশালী উপায় সরবরাহ করে। RuntimeTypeAdapterFactory ব্যবহার করে আপনি JSON এর মাধ্যমে আপনার অবজেক্টের subtype গুলি সঠিকভাবে serialize/deserialze করতে পারবেন।
Read more