Gson লাইব্রেরি সাধারণত mutable (পরিবর্তনযোগ্য) ক্লাসগুলির জন্য কাজ করতে ডিজাইন করা হয়েছে, তবে আপনি immutable classes এর জন্যও Gson ব্যবহার করতে পারেন। Immutable class এমন একটি ক্লাস যার অবজেক্ট একবার তৈরি হওয়ার পর তার মান পরিবর্তন করা যায় না। সাধারণত, এই ধরনের ক্লাসগুলিতে final ফিল্ড থাকে এবং তাদের জন্য setter methods থাকে না, কিন্তু getter methods থাকে। Immutable ক্লাসগুলি সাধারণত থ্রেড সেফ এবং বেশি পারফরম্যান্স দেয়, বিশেষত যেখানে ডেটা অপরিবর্তনীয় থাকা জরুরি।
Gson এর সাথে immutable classes কাজ করার জন্য কিছু কৌশল রয়েছে, যেগুলি সাধারণভাবে constructor এর মাধ্যমে অবজেক্টের মান সেট করার এবং TypeAdapter ব্যবহার করে কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন করার উপর ভিত্তি করে।
Immutable Class এর সাথে Gson এর কাজ করার কৌশল
- Immutable Class তৈরি করা: Immutable class এ সাধারণত final ফিল্ড থাকে এবং ফিল্ডের জন্য getter methods থাকে কিন্তু setter methods থাকে না।
- Gson এর মাধ্যমে Immutable Object সিরিয়ালাইজ ও ডেসেরিয়ালাইজ করা: Gson অবজেক্ট তৈরি করতে setter methods ব্যবহার করে, কিন্তু immutable class এর ক্ষেত্রে আপনি constructor ব্যবহার করে অবজেক্ট তৈরি করতে হবে। Gson এর জন্য এই অবজেক্ট তৈরি করতে একটি কাস্টম TypeAdapter তৈরি করতে হবে, যা constructor এর মাধ্যমে অবজেক্ট তৈরি করবে।
উদাহরণ: Immutable Class এবং Gson এর মাধ্যমে সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন
ধরা যাক, আমাদের একটি Person নামক immutable ক্লাস রয়েছে যার দুটি final ফিল্ড আছে: name এবং age।
১. Immutable Class তৈরি করা
public class Person {
private final String name;
private final int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
২. Gson দিয়ে Immutable Class সিরিয়ালাইজ ও ডেসেরিয়ালাইজ করা
Gson দিয়ে immutable class এর অবজেক্ট সিরিয়ালাইজ এবং ডেসেরিয়ালাইজ করার জন্য, TypeAdapter ব্যবহার করতে হবে, কারণ Gson ডিফল্টভাবে setter methods ব্যবহার করে ডেটা সেট করে।
import com.google.gson.*;
import java.lang.reflect.Type;
public class Main {
public static void main(String[] args) {
// Gson instance with custom TypeAdapter
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonAdapter())
.create();
// Create an immutable Person object
Person person = new Person("John", 30);
// Serialize the Person object to JSON
String json = gson.toJson(person);
System.out.println("Serialized JSON: " + json);
// Deserialize the JSON back to a Person object
Person deserializedPerson = gson.fromJson(json, Person.class);
System.out.println("Deserialized Person: " + deserializedPerson.getName() + ", " + deserializedPerson.getAge());
}
}
// Custom TypeAdapter for Person class
class PersonAdapter implements JsonSerializer<Person>, JsonDeserializer<Person> {
@Override
public JsonElement serialize(Person person, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("name", person.getName());
jsonObject.addProperty("age", person.getAge());
return jsonObject;
}
@Override
public Person deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String name = jsonObject.get("name").getAsString();
int age = jsonObject.get("age").getAsInt();
return new Person(name, age); // Create Person object using constructor
}
}
কোডের ব্যাখ্যা:
- Immutable Class:
Personক্লাসটি একটি immutable ক্লাস যা final ফিল্ড এবং getter methods ধারণ করে। এতে কোনো setter method নেই, শুধুমাত্র একটি constructor ব্যবহার করা হয়েছে। - TypeAdapter:
PersonAdapterকাস্টম TypeAdapter যাPersonক্লাসের জন্য JsonSerializer এবং JsonDeserializer ইমপ্লিমেন্ট করে।- serialize() মেথডে
Personঅবজেক্টটিকে JSON object এ রূপান্তর করা হয়। - deserialize() মেথডে JSON object থেকে
Personঅবজেক্ট তৈরি করার জন্য কাস্টম constructor ব্যবহার করা হয়, কারণPersonক্লাসটি immutable এবং কোনো setter methods নেই।
- GsonBuilder: PersonAdapter কে registerTypeAdapter এর মাধ্যমে Gson-এর সাথে রেজিস্টার করা হয়েছে, যাতে Gson জানে যে Person ক্লাসের জন্য PersonAdapter ব্যবহার করতে হবে।
আউটপুট:
Serialized JSON: {"name":"John","age":30}
Deserialized Person: John, 30
আরও কিছু কৌশল:
৩. Constructor-এ @SerializedName ব্যবহার করা:
যদি আপনার immutable ক্লাসে constructor parameters এর নাম আলাদা হয়, তবে আপনি @SerializedName এনোটেশন ব্যবহার করে JSON ফিল্ডের নাম এবং ক্লাসের প্যারামিটার নামের মধ্যে ম্যাপিং করতে পারেন।
public class Person {
private final String name;
private final int age;
public Person(@SerializedName("fullName") String name, @SerializedName("years") int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
এখানে @SerializedName("fullName") এবং @SerializedName("years") ব্যবহার করা হয়েছে, যা JSON ডেটার fullName এবং years ফিল্ডগুলিকে name এবং age প্যারামিটারগুলির সাথে ম্যাপ করবে।
Gson দিয়ে immutable classes সিরিয়ালাইজ এবং ডেসেরিয়ালাইজ করা কিছুটা আলাদা হয়, কারণ Gson setter methods ব্যবহার করে অবজেক্টে মান সেট করে, কিন্তু immutable ক্লাসের ক্ষেত্রে constructor এর মাধ্যমে মান সেট করা হয়। এই সমস্যার সমাধান হিসেবে TypeAdapter ব্যবহার করা হয়, যা JsonSerializer এবং JsonDeserializer ইমপ্লিমেন্ট করে এবং কাস্টম constructor এর মাধ্যমে অবজেক্ট তৈরি করে। Gson এর মাধ্যমে immutable classes এর ডেটা সঠিকভাবে সিরিয়ালাইজ এবং ডেসেরিয়ালাইজ করা সম্ভব হয় এই কৌশলের মাধ্যমে।
Read more