Gson-এ Runtime Type Adapter ব্যবহৃত হয় যখন আপনি জানেন না কোন টাইপের অবজেক্ট JSON ডেটা থেকে ডেসিরিয়ালাইজ হবে এবং এই টাইপটি রানটাইমে নির্ধারণ করতে হবে। সাধারণত, TypeAdapter বা JsonDeserializer কাস্টমাইজ করার সময়, আমরা ফিক্সড টাইপ ব্যবহার করি, কিন্তু কখনও কখনও এটি জানানো সম্ভব নয়, বিশেষত যখন JSON ডেটা অনেক ভিন্ন টাইপের অবজেক্টের মিশ্রণ থাকে এবং এগুলোকে একটি নির্দিষ্ট সুপার ক্লাস বা ইন্টারফেসের অধীনে ডেসিরিয়ালাইজ করা দরকার।
এমন পরিস্থিতিতে, Runtime Type Adapter ব্যবহার করা হয়, যাতে আপনি ডাইনামিকভাবে নির্ধারণ করতে পারেন JSON ডেটার টাইপ এবং সঠিক টাইপে ডেসিরিয়ালাইজ করতে পারেন।
Runtime Type Adapter এর ধারণা
রানটাইম টাইপ অ্যাডাপ্টার তৈরি করতে আপনি GsonBuilder এবং TypeAdapterFactory ব্যবহার করেন, যা একটি কাস্টম TypeAdapter তৈরি করতে সাহায্য করে, যেটি ডেটার টাইপ নির্ধারণ করে এবং সেই অনুযায়ী ডেসিরিয়ালাইজ বা সিরিয়ালাইজ করে।
Runtime Type Adapter তৈরির উদাহরণ:
ধরা যাক, আপনার কাছে একটি সাধারণ Animal ইন্টারফেস এবং তার দুটি কনক্রিট ক্লাস Dog এবং Cat আছে। JSON ডেটা থেকে আপনি জানেন না কোন টাইপের অবজেক্ট আসবে (Dog অথবা Cat), তাই রানটাইমে এটা নির্ধারণ করে সঠিক টাইপে ডেসিরিয়ালাইজ করতে হবে।
Step 1: Define the Class Hierarchy
// Animal interface
public interface Animal {
String makeSound();
}
// Dog class implementing Animal
public class Dog implements Animal {
String name;
public Dog(String name) {
this.name = name;
}
@Override
public String makeSound() {
return "Woof!";
}
}
// Cat class implementing Animal
public class Cat implements Animal {
String name;
public Cat(String name) {
this.name = name;
}
@Override
public String makeSound() {
return "Meow!";
}
}
Step 2: Create a Runtime Type Adapter
এখন, আপনাকে Animal টাইপের জন্য একটি Runtime Type Adapter তৈরি করতে হবে, যাতে Gson রানটাইমে টাইপটি চিনে এবং সঠিক Animal অবজেক্ট তৈরি করতে পারে।
import com.google.gson.*;
import java.lang.reflect.Type;
public class AnimalAdapter implements JsonSerializer<Animal>, JsonDeserializer<Animal> {
@Override
public JsonElement serialize(Animal src, Type typeOfSrc, JsonSerializationContext context) {
// Type of animal is determined at runtime
JsonObject jsonObject = new JsonObject();
if (src instanceof Dog) {
jsonObject.addProperty("type", "dog");
jsonObject.addProperty("name", ((Dog) src).name);
} else if (src instanceof Cat) {
jsonObject.addProperty("type", "cat");
jsonObject.addProperty("name", ((Cat) src).name);
}
return jsonObject;
}
@Override
public Animal deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String type = jsonObject.get("type").getAsString();
if ("dog".equals(type)) {
return new Dog(jsonObject.get("name").getAsString());
} else if ("cat".equals(type)) {
return new Cat(jsonObject.get("name").getAsString());
}
throw new JsonParseException("Unknown animal type");
}
}
Step 3: Register the Runtime Type Adapter with Gson
এখন, আমরা GsonBuilder এর মাধ্যমে এই AnimalAdapter কাস্টম অ্যাডাপ্টারটি Gson-এ রেজিস্টার করব।
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Main {
public static void main(String[] args) {
// Create the Gson instance with the AnimalAdapter registered
Gson gson = new GsonBuilder()
.registerTypeAdapter(Animal.class, new AnimalAdapter())
.create();
// Example JSON for Dog
String dogJson = "{\"type\":\"dog\", \"name\":\"Buddy\"}";
// Deserialize the JSON into Animal (Dog in this case)
Animal dog = gson.fromJson(dogJson, Animal.class);
System.out.println(dog.makeSound()); // Output: Woof!
// Example JSON for Cat
String catJson = "{\"type\":\"cat\", \"name\":\"Whiskers\"}";
// Deserialize the JSON into Animal (Cat in this case)
Animal cat = gson.fromJson(catJson, Animal.class);
System.out.println(cat.makeSound()); // Output: Meow!
}
}
Step 4: Output
Woof!
Meow!
ব্যাখ্যা:
AnimalAdapterকাস্টমJsonSerializerএবংJsonDeserializerইন্টারফেস ইমপ্লিমেন্ট করেছে। এখানে,serialize()মেথডDogএবংCatঅবজেক্টকে JSON-এ কনভার্ট করে, এবংdeserialize()মেথড JSON ডেটা থেকে সঠিক টাইপের অবজেক্ট (এক্ষেত্রেDogবাCat) তৈরি করে।GsonBuilder-এregisterTypeAdapter()মেথড ব্যবহার করে এই কাস্টম অ্যাডাপ্টার রেজিস্টার করা হয়েছে।- JSON ডেটায়
typeপ্রপার্টি ব্যবহার করা হয়েছে (যাdogবাcatহতে পারে), যার মাধ্যমে Gson রানটাইমে টাইপটি সনাক্ত করে সঠিক ক্লাসের অবজেক্ট তৈরি করছে।
Runtime Type Adapter ব্যবহার করার সুবিধা:
- ডায়নামিক টাইপ সনাক্তকরণ: রানটাইমে JSON ডেটার টাইপ নির্ধারণ করা যায় এবং সঠিক ক্লাসে ডেসিরিয়ালাইজ করা যায়।
- কমপ্লেক্স টাইপ হ্যান্ডলিং: যখন অনেক ক্লাস একে অপরের সাথে সম্পর্কিত থাকে (যেমন সুপার ক্লাস এবং সাব ক্লাস), তখন এটি সহজেই ব্যবহৃত হতে পারে।
- নির্দিষ্ট টাইপ ডেটার জন্য কাস্টম কনভার্টার: বিভিন্ন টাইপের অবজেক্টগুলির জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন প্রক্রিয়া প্রয়োগ করা সম্ভব।
সংক্ষেপে:
Runtime Type Adapter ব্যবহার করে আপনি ডাইনামিকভাবে JSON ডেটা থেকে সঠিক টাইপের অবজেক্ট তৈরি করতে পারেন, যা বেশ উপকারী যখন JSON ডেটা বিভিন্ন টাইপের অবজেক্ট মিশ্রিত থাকে এবং সেগুলোকে সঠিক ক্লাসে কনভার্ট করতে হয়।
Read more