Skill

Gson এবং Immutable Object হ্যান্ডলিং

জিসন (Gson) - Java Technologies

409

Gson এবং Immutable Objects এর মধ্যে কাজ করার সময় কিছু বিশেষ লক্ষ্য রাখা প্রয়োজন, কারণ Immutable objects পরিবর্তনশীল (mutable) নয়, অর্থাৎ তাদের ফিল্ডগুলি একবার সেট করার পর পরিবর্তন করা যায় না। Gson-এর মাধ্যমে Immutable objects প্রক্রিয়া করার জন্য কিছু কৌশল রয়েছে, যাতে আপনি সঠিকভাবে Serialization (Object to JSON) এবং Deserialization (JSON to Object) করতে পারেন।

Immutable Object কী?

Immutable Object এমন একটি অবজেক্ট যার অবস্থা (state) একবার সেট করার পর আর পরিবর্তন করা যায় না। সাধারণত, Immutable objects এর ফিল্ড গুলি final হয় এবং কনস্ট্রাক্টরের মাধ্যমে তাদের মান দেওয়া হয়।

Gson এবং Immutable Object:

যেহেতু Gson ডিফল্টভাবে setter methods ব্যবহার করে Object এর মান পরিবর্তন করে, এবং Immutable objects এ setter methods থাকে না, তাই Gson এ Immutable objects এর জন্য কাস্টম TypeAdapter ব্যবহার করতে হয়। এটি সাধারণত Deserialization অংশে প্রয়োজন হয়, যেখানে Gson JSON ডেটা থেকে অবজেক্ট তৈরি করার জন্য কোন setter method খুঁজে পায় না।

1. Immutable Object তৈরি করা:

ধরা যাক, আমাদের একটি Person ক্লাস রয়েছে, যা Immutable object। এর ফিল্ড গুলি final এবং কনস্ট্রাক্টরের মাধ্যমে সেট করা হয়।

public class Person {
    private final String name;
    private final int age;

    // Constructor to initialize the fields
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getters
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

এটি একটি Immutable object কারণ, একবার name এবং age সেট হলে, আপনি তাদের আর পরিবর্তন করতে পারবেন না।

2. Gson দিয়ে Immutable Object Serializing (Object to JSON):

Gson দ্বারা Immutable objects কে JSON-এ কনভার্ট করা খুব সহজ। কারণ Gson কেবল ফিল্ডের মান পেতে getter মেথড ব্যবহার করে, এবং Immutable objects এ getter মেথডগুলো থাকে।

উদাহরণ:

import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        // Immutable Person object তৈরি
        Person person = new Person("John Doe", 30);

        // Gson দিয়ে Person অবজেক্ট JSON-এ কনভার্ট করা
        Gson gson = new Gson();
        String json = gson.toJson(person);
        System.out.println(json);
    }
}

আউটপুট:

{
  "name": "John Doe",
  "age": 30
}

এখানে কোনো সমস্যা হয়নি কারণ Gson getter মেথডগুলো ব্যবহার করে Immutable Object কে JSON-এ কনভার্ট করেছে।

3. Immutable Object Deserializing (JSON to Object):

যেহেতু Immutable objects এ setter methods থাকে না, তাই Gson ডিফল্টভাবে JSON থেকে Immutable objects এ ডেটা প্রবাহিত করতে পারে না। এজন্য Custom TypeAdapter ব্যবহার করতে হবে যাতে Gson JSON ডেটা থেকে Immutable Object তৈরি করতে পারে।

কাস্টম TypeAdapter তৈরি করা:

আমরা একটি TypeAdapter তৈরি করতে পারি যাতে Gson JSON ডেটা থেকে Immutable Object তৈরি করতে পারে।

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;

public class PersonTypeAdapter extends TypeAdapter<Person> {

    @Override
    public void write(JsonWriter out, Person person) throws IOException {
        if (person == null) {
            out.nullValue();
            return;
        }

        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 তৈরি
    }
}

4. Custom TypeAdapter ব্যবহার করে Immutable Object Deserialize করা:

এখন, আপনি এই কাস্টম TypeAdapter ব্যবহার করে JSON থেকে Immutable object তৈরি করতে পারবেন।

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {
    public static void main(String[] args) {
        String json = "{\"name\":\"John Doe\", \"age\":30}";

        // GsonBuilder দিয়ে কাস্টম TypeAdapter রেজিস্টার করা
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Person.class, new PersonTypeAdapter())
                .create();

        // JSON থেকে Person অবজেক্ট তৈরি করা
        Person person = gson.fromJson(json, Person.class);

        // Person অবজেক্ট প্রিন্ট করা
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}

আউটপুট:

Name: John Doe
Age: 30

5. আরেকটি উপায়: Constructor Based Deserialization:

গোসন দিয়ে Immutable Object ডেসিরিয়ালাইজ করার একটি সহজ উপায় হল @JsonAdapter অ্যানোটেশন ব্যবহার করা। এটি TypeAdapter সরাসরি ক্লাসের কনস্ট্রাক্টরের সাথে যুক্ত করতে সাহায্য করে। তবে, এটি Gson লাইব্রেরির কিছু ভার্সনে সমর্থিত।

import com.google.gson.annotations.JsonAdapter;

@JsonAdapter(PersonTypeAdapter.class)
public class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter methods
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

এখানে PersonTypeAdapter ক্লাসটি Person ক্লাসের সাথে অ্যাসোসিয়েটেড, এবং Gson এটি ব্যবহার করে JSON ডেটা থেকে Immutable object তৈরি করবে।

6. অন্য কিছু গুরুত্বপূর্ণ বিষয়:

  • Gson এর সাথে Immutable Object ব্যবহারের মূল চ্যালেঞ্জ হল Deserialization। কেননা Immutable objects এ কোনো setter methods থাকে না। কিন্তু, TypeAdapter ব্যবহার করে এটি সহজেই সমাধান করা যায়।
  • Custom TypeAdapter ব্যবহার করার মাধ্যমে, আপনি JSON থেকে Immutable objects এ ডেটা প্রবাহিত করার জন্য কাস্টম লজিক প্রয়োগ করতে পারবেন।
  • Serialization ক্ষেত্রে, Gson কোন সমস্যা ছাড়াই Immutable objects কে JSON-এ কনভার্ট করতে পারে, কারণ Gson getter মেথড ব্যবহার করে কাজ করে।
  • Deserialization ক্ষেত্রে, Immutable objects এর জন্য আপনাকে Custom TypeAdapter তৈরি করতে হবে, যাতে Gson JSON থেকে Immutable object তৈরি করতে পারে, কারণ Immutable objects এ setter methods থাকে না।

এভাবেই আপনি Gson এবং Immutable objects এর মধ্যে কাজ করতে পারেন।

Content added By

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

Gson লাইব্রেরি সাধারণত mutable (পরিবর্তনযোগ্য) ক্লাসগুলির জন্য কাজ করতে ডিজাইন করা হয়েছে, তবে আপনি immutable classes এর জন্যও Gson ব্যবহার করতে পারেন। Immutable class এমন একটি ক্লাস যার অবজেক্ট একবার তৈরি হওয়ার পর তার মান পরিবর্তন করা যায় না। সাধারণত, এই ধরনের ক্লাসগুলিতে final ফিল্ড থাকে এবং তাদের জন্য setter methods থাকে না, কিন্তু getter methods থাকে। Immutable ক্লাসগুলি সাধারণত থ্রেড সেফ এবং বেশি পারফরম্যান্স দেয়, বিশেষত যেখানে ডেটা অপরিবর্তনীয় থাকা জরুরি।

Gson এর সাথে immutable classes কাজ করার জন্য কিছু কৌশল রয়েছে, যেগুলি সাধারণভাবে constructor এর মাধ্যমে অবজেক্টের মান সেট করার এবং TypeAdapter ব্যবহার করে কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন করার উপর ভিত্তি করে।


Immutable Class এর সাথে Gson এর কাজ করার কৌশল

  1. Immutable Class তৈরি করা: Immutable class এ সাধারণত final ফিল্ড থাকে এবং ফিল্ডের জন্য getter methods থাকে কিন্তু setter methods থাকে না।
  2. 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
    }
}

কোডের ব্যাখ্যা:

  1. Immutable Class: Person ক্লাসটি একটি immutable ক্লাস যা final ফিল্ড এবং getter methods ধারণ করে। এতে কোনো setter method নেই, শুধুমাত্র একটি constructor ব্যবহার করা হয়েছে।
  2. TypeAdapter:
    • PersonAdapter কাস্টম TypeAdapter যা Person ক্লাসের জন্য JsonSerializer এবং JsonDeserializer ইমপ্লিমেন্ট করে।
    • serialize() মেথডে Person অবজেক্টটিকে JSON object এ রূপান্তর করা হয়।
    • deserialize() মেথডে JSON object থেকে Person অবজেক্ট তৈরি করার জন্য কাস্টম constructor ব্যবহার করা হয়, কারণ Person ক্লাসটি immutable এবং কোনো setter methods নেই।
  3. 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 এর ডেটা সঠিকভাবে সিরিয়ালাইজ এবং ডেসেরিয়ালাইজ করা সম্ভব হয় এই কৌশলের মাধ্যমে।

Content added By

Immutable Data Structures (যেমন, অবজেক্টগুলো যেগুলোর ফিল্ড একবার সেট করার পর পরিবর্তন করা যায় না) এর জন্য Custom Serializer তৈরি করতে হলে, আপনাকে Gson ব্যবহার করে একটি কাস্টম TypeAdapter বা JsonSerializer তৈরি করতে হবে। Immutable অবজেক্টে সাধারণত final ফিল্ড থাকে, এবং এগুলোর মান কখনও পরিবর্তন হয় না। Gson এর সাহায্যে, আপনি একটি Immutable অবজেক্টকে JSON এ রূপান্তর (serialization) করতে পারবেন এবং আবার JSON থেকে Java অবজেক্টে রূপান্তর (deserialization) করতে পারবেন, তবে Immutable অবজেক্টের ক্ষেত্রে কিছু অতিরিক্ত কনফিগারেশন প্রয়োজন হয়।

Immutable Data Structure-এর জন্য Custom Serializer

ধরা যাক, আপনি একটি Person ক্লাস তৈরি করেছেন যেটি একটি Immutable ক্লাস (যার ফিল্ডগুলো final):

Step 1: Immutable Person ক্লাস তৈরি করা

public class Person {
    private final String name;
    private final int age;
    private final String email;

    // Constructor
    public Person(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    // Getters
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getEmail() {
        return email;
    }
}

এখানে, Person ক্লাসটি Immutable, কারণ এর ফিল্ডগুলো final এবং শুধুমাত্র কনস্ট্রাক্টর দ্বারা সেট করা হয়।

Step 2: Custom JsonSerializer তৈরি করা

Immutable অবজেক্টের জন্য একটি Custom Serializer তৈরি করতে, আপনাকে JsonSerializer ইন্টারফেস ইমপ্লিমেন্ট করতে হবে। এই Serializer একটি Immutable Person অবজেক্টকে JSON-এ কনভার্ট করবে।

import com.google.gson.*;
import java.lang.reflect.Type;

public class PersonSerializer 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());
        jsonObject.addProperty("email", person.getEmail());
        return jsonObject;
    }
}

এখানে, PersonSerializer ক্লাসটি JsonSerializer ইন্টারফেস ইমপ্লিমেন্ট করে এবং serialize() মেথডের মাধ্যমে Person অবজেক্টকে JSON এ রূপান্তর করে।

Step 3: GsonBuilder দিয়ে Serializer রেজিস্টার করা

এখন, আমরা GsonBuilder ব্যবহার করে আমাদের Custom Serializer রেজিস্টার করব।

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {
    public static void main(String[] args) {
        // GsonBuilder দিয়ে Gson তৈরি করা
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Person.class, new PersonSerializer()) // Custom Serializer রেজিস্টার করা
                        .create();

        // Immutable Person অবজেক্ট তৈরি করা
        Person person = new Person("John Doe", 30, "john.doe@example.com");

        // Person অবজেক্টকে JSON-এ রূপান্তর
        String json = gson.toJson(person);

        // JSON প্রিন্ট করা
        System.out.println(json);
    }
}

Step 4: Output

এখন যদি আপনি Person অবজেক্টটি JSON-এ রূপান্তর করেন, তাহলে আউটপুট হবে:

{"name":"John Doe","age":30,"email":"john.doe@example.com"}

Step 5: Custom Deserializer (Optional)

যেহেতু আপনি Immutable অবজেক্টের জন্য Custom Serializer তৈরি করেছেন, একইভাবে আপনি একটি Custom Deserializer তৈরি করতে পারেন, যা JSON থেকে Immutable অবজেক্টে রূপান্তর করবে।

import com.google.gson.*;

import java.lang.reflect.Type;

public class PersonDeserializer 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();
        String email = jsonObject.get("email").getAsString();

        return new Person(name, age, email);  // Person অবজেক্টে রূপান্তর করা
    }
}

এখন, GsonBuilder এর মাধ্যমে আপনি PersonDeserializer কে register করে JSON ডেটাকে Person অবজেক্টে রূপান্তর করতে পারবেন।

Gson gson = new GsonBuilder()
                .registerTypeAdapter(Person.class, new PersonSerializer())   // Custom Serializer
                .registerTypeAdapter(Person.class, new PersonDeserializer()) // Custom Deserializer
                .create();

String json = "{\"name\":\"John Doe\",\"age\":30,\"email\":\"john.doe@example.com\"}";

// JSON থেকে Person অবজেক্টে রূপান্তর
Person personFromJson = gson.fromJson(json, Person.class);
System.out.println(personFromJson.getName());

Output:

John Doe

বিস্তারিত ব্যাখ্যা:

  1. Custom Serializer: এখানে PersonSerializer ক্লাসটি JSON-এ রূপান্তর করতে কাজ করেছে। serialize() মেথডটি Person অবজেক্টের final ফিল্ডগুলোর মান JSON অবজেক্টে সেট করে।
  2. Custom Deserializer (Optional): যদি আপনি JSON থেকে Immutable অবজেক্টে রূপান্তর করতে চান, তবে Custom Deserializer তৈরি করতে হবে, যেখানে JSON ডেটার বিভিন্ন প্রপার্টি থেকে মান নিয়ে একটি Immutable অবজেক্ট তৈরি করা হয়।
  3. GsonBuilder: GsonBuilder ব্যবহার করে আমরা Custom Serializer এবং Custom Deserializer রেজিস্টার করেছি, যাতে Gson JSON ডেটা প্রক্রিয়া করতে পারে।

সংক্ষেপে:

  • Immutable Data Structure এর জন্য Custom Serializer তৈরি করতে JsonSerializer ব্যবহার করা হয়।
  • Immutable অবজেক্টে final ফিল্ড থাকে, যেগুলোর মান কনস্ট্রাক্টরের মাধ্যমে সেট করা হয় এবং এগুলোর মান পরিবর্তন হয় না।
  • Gson এর Custom Serializer এবং Custom Deserializer ব্যবহার করে Immutable Data Structures কে JSON এবং Java অবজেক্টে রূপান্তর করা যায়।
Content added By

Java 14 এর পরে record টাইপ introduced হয়েছে, যা একটি নতুন ধরনের ক্লাস যা ডেটা স্টোর করার জন্য ব্যবহৃত হয়, এবং এটি অনুবর্তী getter, setter, equals(), hashCode(), এবং toString() মেথডগুলি তৈরি করে। record টাইপকে Gson এর সাথে ব্যবহার করা একটু ভিন্ন হতে পারে কারণ Gson সাধারণভাবে একটি POJO (Plain Old Java Object) হিসেবে কাজ করে, তবে record টাইপ JSON সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশনের জন্যও সমর্থিত।

যেহেতু recordgetter, setter মেথডগুলি নিজেই অটোমেটিক্যালি তৈরি হয়, Gson স্বাভাবিকভাবেই এটি পরিচালনা করতে সক্ষম। তবে, কাস্টম ফরম্যাট এবং অন্যান্য বৈশিষ্ট্য সহ JSON ম্যানিপুলেশন করার জন্য Gson এবং Java record এর সঠিক ইন্টিগ্রেশন প্রয়োজন।

উদাহরণ: Gson এবং Java record Integration

1. Java Record টাইপ

Java Record ক্লাস সাধারণভাবে ডেটা ধারণ করার জন্য ব্যবহৃত হয়। ধরুন, একটি Person রেকর্ড আছে:

public record Person(String name, int age) {}

এই রেকর্ড ক্লাসটি দুটি ফিল্ড name এবং age ধারণ করবে, এবং এর সাথে স্বয়ংক্রিয়ভাবে getter এবং toString() মেথড তৈরি হবে।

2. Gson Integration:

Gson এর সাথে Java record ইন্টিগ্রেট করতে, আপনি Gson এর সাধারণ পদ্ধতি ব্যবহার করতে পারেন। Gson record টাইপকে হ্যান্ডল করতে পারে কারণ এটি ঐতিহ্যগত POJO টাইপের মতো একইভাবে কাজ করে।

উদাহরণ কোড:

import com.google.gson.Gson;

public record Person(String name, int age) {
    // No need for explicit constructors, getters, or setters, they are auto-generated
}

public class Main {
    public static void main(String[] args) {
        // Gson ইনস্ট্যান্স তৈরি
        Gson gson = new Gson();

        // একটি Person রেকর্ড অবজেক্ট তৈরি
        Person person = new Person("John", 30);

        // JSON এ সিরিয়ালাইজ করা
        String json = gson.toJson(person);
        System.out.println("Serialized JSON: " + json);

        // JSON থেকে Person অবজেক্ট ডেসিরিয়ালাইজ করা
        Person deserializedPerson = gson.fromJson(json, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson);
    }
}

আউটপুট:

Serialized JSON: {"name":"John","age":30}
Deserialized Person: Person[name=John, age=30]

ব্যাখ্যা:

  1. Java Record ক্লাস: Person নামের রেকর্ডে name এবং age ফিল্ড রয়েছে।
  2. Gson সিরিয়ালাইজেশন: gson.toJson() ব্যবহার করে Person অবজেক্টটি JSON ফরম্যাটে সিরিয়ালাইজ করা হয়েছে।
  3. Gson ডেসিরিয়ালাইজেশন: gson.fromJson() ব্যবহার করে JSON থেকে আবার Person অবজেক্টে রূপান্তর করা হয়েছে।

3. কাস্টম record সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন:

যদি আপনি record টাইপের জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন চান, তবে আপনি কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার ব্যবহার করতে পারেন।

উদাহরণ: কাস্টম সিরিয়ালাইজেশন

ধরা যাক, আপনি Person রেকর্ডের age ফিল্ডকে age in years ফরম্যাটে JSON এ সিরিয়ালাইজ করতে চান।

import com.google.gson.*;
import java.lang.reflect.Type;

public record Person(String name, int age) {}

class PersonSerializer implements JsonSerializer<Person> {
    @Override
    public JsonElement serialize(Person person, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("name", person.name());
        jsonObject.addProperty("age_in_years", person.age());
        return jsonObject;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", 30);

        // Gson ইনস্ট্যান্স তৈরি কাস্টম সিরিয়ালাইজার সহ
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Person.class, new PersonSerializer())
                        .create();

        // JSON সিরিয়ালাইজ করা
        String json = gson.toJson(person);
        System.out.println("Serialized JSON with custom serializer: " + json);
    }
}

আউটপুট:

Serialized JSON with custom serializer: {"name":"John","age_in_years":30}

কাস্টম ডেসিরিয়ালাইজেশন:

class PersonDeserializer 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_in_years").getAsInt();  // Custom field name
        return new Person(name, age);
    }
}

public class Main {
    public static void main(String[] args) {
        String json = "{\"name\":\"John\",\"age_in_years\":30}";

        // Gson ইনস্ট্যান্স তৈরি কাস্টম ডেসিরিয়ালাইজার সহ
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Person.class, new PersonDeserializer())
                        .create();

        // JSON থেকে Person অবজেক্ট ডেসিরিয়ালাইজ করা
        Person person = gson.fromJson(json, Person.class);
        System.out.println("Deserialized Person with custom deserializer: " + person);
    }
}

আউটপুট:

Deserialized Person with custom deserializer: Person[name=John, age=30]

4. মনে রাখার বিষয়:

  • Records সাধারণভাবে immutable হয়, অর্থাৎ name এবং age ফিল্ডগুলি একবার তৈরি হলে পরিবর্তন করা যাবে না।
  • Gson record টাইপের জন্য স্বাভাবিকভাবে কাজ করবে, কারণ record ফিল্ডগুলির জন্য স্বয়ংক্রিয়ভাবে getter মেথড তৈরি করা হয়।
  • কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন ব্যবহার করে আপনি JSON ফরম্যাট এবং ডেটার কাঠামো কাস্টমাইজ করতে পারেন।

সারাংশ:

  • Java record ক্লাসের সাথে Gson-এর ইন্টিগ্রেশন খুবই সহজ এবং এটি সাধারণভাবে কাজ করে যেমন POJO ক্লাসের জন্য।
  • কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার ব্যবহার করে আপনি record টাইপের JSON ফরম্যাট কাস্টমাইজ করতে পারেন।
Content added By
Promotion

Are you sure to start over?

Loading...