Gson দিয়ে Subclasses এবং Superclasses হ্যান্ডলিং একটি গুরুত্বপূর্ণ টপিক, কারণ অনেক সময় আপনার Java প্রোগ্রামে একাধিক ক্লাস বা অবজেক্টের হায়ারার্কি থাকতে পারে, যেখানে Superclass এবং Subclass গুলি ভিন্ন ধরনের অবজেক্ট রূপে পরিণত হয়। Gson এই ধরনের অবজেক্ট সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে সক্ষম, তবে সঠিকভাবে কাজ করতে হলে কিছু কাস্টম কনফিগারেশন প্রয়োজন হতে পারে।
Gson ডিফল্টভাবে Superclass এবং Subclass গুলি সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারে, তবে যদি আপনি Type Information সংরক্ষণ করতে চান বা কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করতে চান, তবে TypeAdapter বা TypeToken ব্যবহার করতে হবে।
এখানে আমরা আলোচনা করবো কিভাবে Gson দিয়ে Superclass এবং Subclass গুলি হ্যান্ডল করা যায়।
1. Basic Example: Superclass এবং Subclass with Gson
প্রথমে, একটি সাধারণ উদাহরণ দেখে নেই, যেখানে Superclass এবং Subclass গুলি Gson এর মাধ্যমে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হচ্ছে।
উদাহরণ: Superclass এবং Subclass হ্যান্ডলিং
import com.google.gson.*;
class Animal {
String name;
Animal(String name) {
this.name = name;
}
}
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name);
this.breed = breed;
}
}
public class Main {
public static void main(String[] args) {
// Subclass object (Dog)
Dog dog = new Dog("Rex", "German Shepherd");
// Gson দিয়ে Subclass এবং Superclass সিরিয়ালাইজেশন
Gson gson = new Gson();
String json = gson.toJson(dog);
System.out.println("Serialized JSON: " + json);
// JSON থেকে Subclass অবজেক্টে ডেসিরিয়ালাইজ করা
Animal animal = gson.fromJson(json, Animal.class);
System.out.println("Deserialized Object: " + animal.getClass().getSimpleName() + " - " + ((Dog) animal).name);
}
}
আউটপুট:
Serialized JSON: {"name":"Rex","breed":"German Shepherd"}
Deserialized Object: Dog - Rex
ব্যাখ্যা:
- এখানে
Dogএকটি subclass যাAnimalsuperclass থেকে ইন্সপায়ার করা হয়েছে। - Gson
Dogঅবজেক্টকে সিরিয়ালাইজ করেছে এবং JSON আউটপুট হিসেবেnameএবংbreedপ্রপার্টি অন্তর্ভুক্ত করেছে। - যখন আমরা JSON থেকে
Animalঅবজেক্টে ডেসিরিয়ালাইজ করি, তখন Gson স্বয়ংক্রিয়ভাবে Subclass (এখানেDog) বোঝে এবংnameপ্রপার্টি থেকে ডেসিরিয়ালাইজেশন সম্পন্ন করে।
2. Type Information Preservation with Subclasses
যখন Superclass এবং Subclass গুলি সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হয়, তখন কখনো কখনো Type Information সংরক্ষণ করতে হয়। এই ক্ষেত্রে, @SerializedName অথবা TypeAdapter ব্যবহার করা যায়।
উদাহরণ: Type Information Preservation
import com.google.gson.*;
class Animal {
String name;
Animal(String name) {
this.name = name;
}
}
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name);
this.breed = breed;
}
}
class Cat extends Animal {
int lives;
Cat(String name, int lives) {
super(name);
this.lives = lives;
}
}
public class Main {
public static void main(String[] args) {
// Subclass objects (Dog and Cat)
Dog dog = new Dog("Rex", "Bulldog");
Cat cat = new Cat("Whiskers", 9);
// Gson দিয়ে Superclass এবং Subclass সহ Serialization এবং Type Information Preserve করা
Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create();
// Subclass objects Serialize করা
String dogJson = gson.toJson(dog);
String catJson = gson.toJson(cat);
System.out.println("Serialized Dog JSON: " + dogJson);
System.out.println("Serialized Cat JSON: " + catJson);
// JSON থেকে Superclass অবজেক্টে Deserialize করা (Type Information Preserve করা)
Animal dogAnimal = gson.fromJson(dogJson, Animal.class);
Animal catAnimal = gson.fromJson(catJson, Animal.class);
System.out.println("Deserialized Dog: " + dogAnimal.getClass().getSimpleName() + " - " + ((Dog) dogAnimal).name);
System.out.println("Deserialized Cat: " + catAnimal.getClass().getSimpleName() + " - " + ((Cat) catAnimal).name);
}
}
আউটপুট:
Serialized Dog JSON: {"name":"Rex","breed":"Bulldog"}
Serialized Cat JSON: {"name":"Whiskers","lives":9}
Deserialized Dog: Dog - Rex
Deserialized Cat: Cat - Whiskers
ব্যাখ্যা:
- Gson
DogএবংCatSubclass অবজেক্টগুলিকে আলাদাভাবে JSON ফরম্যাটে সিরিয়ালাইজ করেছে। - JSON থেকে ডেসিরিয়ালাইজ করার সময় Gson স্বয়ংক্রিয়ভাবে যথাযথ Subclass ডেটা বুঝে রূপান্তর করেছে, কারণ
DogএবংCatকাস্টম টাইপ ডেটা ধারণ করছে।
3. Custom Serialization and Deserialization for Subclasses
কখনো কখনো আপনার প্রয়োজন হতে পারে কাস্টম Serialization এবং Deserialization এর জন্য, যেখানে আপনি TypeAdapter ব্যবহার করে Subclass-এর জন্য কাস্টম আচরণ কনফিগার করতে পারেন।
উদাহরণ: Custom Serialization and Deserialization with TypeAdapter
import com.google.gson.*;
class Animal {
String name;
Animal(String name) {
this.name = name;
}
}
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name);
this.breed = breed;
}
}
class AnimalTypeAdapter implements JsonSerializer<Animal>, JsonDeserializer<Animal> {
@Override
public JsonElement serialize(Animal src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
if (src instanceof Dog) {
Dog dog = (Dog) src;
jsonObject.addProperty("type", "dog");
jsonObject.addProperty("name", dog.name);
jsonObject.addProperty("breed", dog.breed);
}
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)) {
String name = jsonObject.get("name").getAsString();
String breed = jsonObject.get("breed").getAsString();
return new Dog(name, breed);
}
return null;
}
}
public class Main {
public static void main(String[] args) {
// Subclass object (Dog)
Dog dog = new Dog("Rex", "Labrador");
// Gson with custom TypeAdapter for Animal (SuperClass)
Gson gson = new GsonBuilder()
.registerTypeAdapter(Animal.class, new AnimalTypeAdapter())
.create();
// Serialize using custom TypeAdapter
String json = gson.toJson(dog);
System.out.println("Custom Serialized JSON: " + json);
// Deserialize using custom TypeAdapter
Animal animal = gson.fromJson(json, Animal.class);
System.out.println("Custom Deserialized Object: " + animal.getClass().getSimpleName() + " - " + ((Dog) animal).name);
}
}
আউটপুট:
Custom Serialized JSON: {"type":"dog","name":"Rex","breed":"Labrador"}
Custom Deserialized Object: Dog - Rex
ব্যাখ্যা:
- এখানে,
AnimalTypeAdapterব্যবহার করে আমরাDogSubclass-এর জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন লজিক তৈরি করেছি। - JSON আউটপুটে
typeপ্রপার্টি সংরক্ষিত করা হয়েছে, যা ডেসিরিয়ালাইজেশন সময় Subclass (Dog) নির্ধারণ করতে ব্যবহৃত হয়।
Gson এর মাধ্যমে Superclass এবং Subclass হ্যান্ডলিং সহজেই করা যায়, তবে কখনো কখনো কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন প্রয়োজন হতে পারে। আপনি TypeAdapter ব্যবহার করে Subclass এবং Superclass এর জন্য কাস্টম লজিক প্রয়োগ করতে পারেন, এবং Type Information সংরক্ষণ করে Subclass গুলিকে সঠিকভাবে ডেসিরিয়ালাইজ করতে পারেন।
Read more