Gson-এ Immutable Objects (যেমন, অবজেক্ট যা একবার তৈরি হওয়ার পর পরিবর্তন করা যায় না) Serialization এবং Deserialization করার জন্য কিছু অতিরিক্ত কাস্টমাইজেশন প্রয়োজন হয়, কারণ Gson ডিফল্টভাবে প্যারামিটারলেস কনস্ট্রাক্টর বা সেটার মেথড ব্যবহার করে অবজেক্ট তৈরি এবং মান সেট করে। কিন্তু Immutable অবজেক্টের ক্ষেত্রে কোন সেটার মেথড বা প্যারামিটারলেস কনস্ট্রাক্টর থাকে না, তাই Gson-এর সাথে কাজ করার জন্য কিছু কাস্টম TypeAdapter বা JsonDeserializer/JsonSerializer তৈরি করতে হয়।
1. Immutable Object এর জন্য Gson Serialization এবং Deserialization
ধরা যাক, আপনার একটি Immutable Object রয়েছে যার কোনো সেটার মেথড নেই এবং কনস্ট্রাক্টর-ই একমাত্র উপায় যার মাধ্যমে অবজেক্ট তৈরি করা যায়।
1.1 Immutable Object তৈরি
public class Person {
private final String name;
private final int age;
// কনস্ট্রাক্টর যা শুধুমাত্র একবার মান সেট করতে দেয়
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter মেথড গুলো
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
এখানে Person ক্লাসটি Immutable কারণ তার প্রোপার্টি name এবং age কেবলমাত্র কনস্ট্রাকটরের মাধ্যমে সেট করা হয় এবং পরে এগুলোর মান পরিবর্তন করা যায় না।
2. Gson দিয়ে Immutable Object Serialize এবং Deserialize
Gson ডিফল্টভাবে Immutable Object সঠিকভাবে serialize এবং deserialize করতে পারে না কারণ এতে setter method বা no-arg constructor নেই। তবে আপনি TypeAdapter ব্যবহার করে এটি কাস্টমাইজ করতে পারেন।
2.1 TypeAdapter ব্যবহার করে Immutable Object Serialization এবং Deserialization
এখানে আমরা TypeAdapter তৈরি করব যা Immutable Person অবজেক্টকে JSON এ রূপান্তর (serialization) এবং JSON থেকে অবজেক্টে রূপান্তর (deserialization) করবে।
import com.google.gson.*;
import java.lang.reflect.Type;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
// Immutable Person অবজেক্ট
Person person = new Person("John", 30);
// Gson Builder ব্যবহার করে TypeAdapter নিবন্ধন
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonTypeAdapter())
.create();
// Serialize
String json = gson.toJson(person);
System.out.println("Serialized JSON: " + json);
// Deserialize
Person deserializedPerson = gson.fromJson(json, Person.class);
System.out.println("Deserialized Person: " + deserializedPerson.getName() + ", Age: " + deserializedPerson.getAge());
}
}
// PersonTypeAdapter: Immutable Object এর জন্য Serializer এবং Deserializer
class PersonTypeAdapter extends TypeAdapter<Person> {
@Override
public void write(JsonWriter out, Person person) throws IOException {
out.beginObject();
out.name("name").value(person.getName());
out.name("age").value(person.getAge());
out.endObject();
}
@Override
public Person read(JsonReader in) throws IOException {
String name = null;
int age = 0;
in.beginObject();
while (in.hasNext()) {
String fieldName = in.nextName();
if (fieldName.equals("name")) {
name = in.nextString();
} else if (fieldName.equals("age")) {
age = in.nextInt();
}
}
in.endObject();
return new Person(name, age); // Immutable Object পুনরায় তৈরি করা
}
}
3. কাস্টম TypeAdapter ব্যাখ্যা
- Serialization (write method): আমরা
Personঅবজেক্ট থেকেnameএবংageমান JSON অবজেক্টে লিখে দিচ্ছি। - Deserialization (read method): JSON থেকে
nameএবংageমান পড়া হচ্ছে এবং এই মানগুলির সাথে নতুন একটিPersonঅবজেক্ট তৈরি করা হচ্ছে, যেহেতুPersonক্লাসটি Immutable এবং সেটার মেথড নেই।
4. আউটপুট:
Serialized JSON: {"name":"John","age":30}
Deserialized Person: John, Age: 30
5. Immutable Object-এর জন্য JsonSerializer এবং JsonDeserializer ব্যবহার
আপনি চাইলে JsonSerializer এবং JsonDeserializer ব্যবহার করেও একই কাজ করতে পারেন।
5.1 Immutable Object এর জন্য JsonSerializer এবং JsonDeserializer
import com.google.gson.*;
import java.lang.reflect.Type;
class PersonJsonSerializer implements JsonSerializer<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;
}
}
class PersonJsonDeserializer implements JsonDeserializer<Person> {
@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); // Immutable Object তৈরি করা
}
}
public class Main {
public static void main(String[] args) {
// Immutable Person অবজেক্ট
Person person = new Person("Alice", 25);
// Gson Builder ব্যবহার করে কাস্টম Serializer এবং Deserializer
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonJsonSerializer())
.registerTypeAdapter(Person.class, new PersonJsonDeserializer())
.create();
// Serialize
String json = gson.toJson(person);
System.out.println("Serialized JSON: " + json);
// Deserialize
Person deserializedPerson = gson.fromJson(json, Person.class);
System.out.println("Deserialized Person: " + deserializedPerson.getName() + ", Age: " + deserializedPerson.getAge());
}
}
6. আউটপুট:
Serialized JSON: {"name":"Alice","age":25}
Deserialized Person: Alice, Age: 25
সারাংশ:
- Immutable Object গুলি Serialize এবং Deserialize করার জন্য TypeAdapter বা JsonSerializer/JsonDeserializer ব্যবহার করতে হয়, কারণ Gson ডিফল্টভাবে কোনো setter method বা no-arg constructor ছাড়া অবজেক্ট তৈরি করতে পারে না।
- TypeAdapter এবং JsonSerializer/JsonDeserializer কাস্টমভাবে Immutable Object Serialize এবং Deserialize করার জন্য সবচেয়ে ভাল পদ্ধতি।
Read more