Immutable Object Serialization এবং Deserialization

Gson এবং Immutable Object হ্যান্ডলিং - জিসন (Gson) - Java Technologies

330

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 করার জন্য সবচেয়ে ভাল পদ্ধতি।
Content added By
Promotion

Are you sure to start over?

Loading...