Skill

Gson এর Type Adapters

জিসন (Gson) - Java Technologies

294

Gson এর Type Adapters খুবই শক্তিশালী এবং নমনীয় একটি ফিচার, যা আপনাকে কাস্টম সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন লজিক বাস্তবায়ন করতে সহায়তা করে। Type Adapter হচ্ছে একটি কাস্টম ক্লাস যা নির্দিষ্ট টাইপের অবজেক্টকে JSON-এ রূপান্তর (সেরিয়ালাইজ) অথবা JSON থেকে Java অবজেক্টে রূপান্তর (ডেসিরিয়ালাইজ) করে।

Gson ডিফল্টভাবে কিছু প্রাথমিক টাইপ যেমন String, Integer, Boolean ইত্যাদি সেরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে সক্ষম। তবে, আপনি যখন কোনো কাস্টম টাইপ, যেমন Date অথবা CustomObject, JSON-এ রূপান্তর করতে চান তখন Type Adapter ব্যবহার করা হয়।

TypeAdapter এর ব্যবহার

1. কাস্টম TypeAdapter তৈরি করা

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

উদাহরণ 1: কাস্টম TypeAdapter ব্যবহার করা

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

// কাস্টম ক্লাস
class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

// কাস্টম TypeAdapter তৈরি করা
class PersonAdapter extends TypeAdapter<Person> {

    @Override
    public void write(JsonWriter out, Person person) throws IOException {
        out.beginObject();
        out.name("full_name").value(person.getName()); // কাস্টম ফিল্ড নাম
        out.name("years_old").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("full_name")) {
                name = in.nextString();
            } else if (fieldName.equals("years_old")) {
                age = in.nextInt();
            }
        }
        in.endObject();
        return new Person(name, age);
    }
}

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

        // Java Object তৈরি করা
        Person person = new Person("John Doe", 30);

        // Java Object কে JSON এ কনভার্ট করা
        String json = gson.toJson(person);
        System.out.println("Serialized JSON: " + json);

        // JSON থেকে Java Object এ কনভার্ট করা
        Person personFromJson = gson.fromJson(json, Person.class);
        System.out.println("Deserialized Person: " + personFromJson.getName() + ", Age: " + personFromJson.getAge());
    }
}

আউটপুট:

Serialized JSON: {"full_name":"John Doe","years_old":30}
Deserialized Person: John Doe, Age: 30

ব্যাখ্যা:

  • write() মেথডে, কাস্টম JSON ফরম্যাটে Person অবজেক্টকে সেরিয়ালাইজ করা হয়েছে।
  • read() মেথডে, JSON থেকে Person অবজেক্ট ডেসিরিয়ালাইজ করা হয়েছে এবং JSON এর ফিল্ড নামগুলো কাস্টমাইজ করা হয়েছে (full_name, years_old)।

2. TypeAdapterFactory ব্যবহার করা

একাধিক টাইপের জন্য কাস্টম সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করতে আপনি TypeAdapterFactory ব্যবহার করতে পারেন। এটি অনেকগুলো টাইপের জন্য একসাথে TypeAdapter তৈরির উপায় প্রদান করে।

উদাহরণ 2: TypeAdapterFactory ব্যবহার করা

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

// কাস্টম Adapter Factory তৈরি করা
class CustomTypeAdapterFactory implements TypeAdapterFactory {

    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        // শুধু Person টাইপের জন্য কাস্টম TypeAdapter প্রদান করা
        if (type.getRawType() == Person.class) {
            return (TypeAdapter<T>) new PersonAdapter();
        }
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        // Gson তৈরি করা কাস্টম TypeAdapterFactory দিয়ে
        Gson gson = new GsonBuilder().registerTypeAdapterFactory(new CustomTypeAdapterFactory()).create();

        // Java Object তৈরি করা
        Person person = new Person("John Doe", 30);

        // Java Object কে JSON এ কনভার্ট করা
        String json = gson.toJson(person);
        System.out.println("Serialized JSON: " + json);

        // JSON থেকে Java Object এ কনভার্ট করা
        Person personFromJson = gson.fromJson(json, Person.class);
        System.out.println("Deserialized Person: " + personFromJson.getName() + ", Age: " + personFromJson.getAge());
    }
}

আউটপুট:

Serialized JSON: {"full_name":"John Doe","years_old":30}
Deserialized Person: John Doe, Age: 30

ব্যাখ্যা:

  • এখানে TypeAdapterFactory তৈরি করা হয়েছে, যা Person টাইপের জন্য কাস্টম TypeAdapter রিটার্ন করে।
  • এর মাধ্যমে আপনি অনেক ধরনের কাস্টম TypeAdapter ব্যবহার করতে পারেন, যেখানে প্রয়োজন হবে।

3. TypeAdapter এর সুবিধা:

  1. কাস্টম সেরিয়ালাইজেশন: আপনি যদি JSON-এ কোনো বিশেষ ফরম্যাটে ডেটা রাখতে চান, তবে TypeAdapter ব্যবহার করতে পারেন।
  2. কাস্টম ডেসিরিয়ালাইজেশন: JSON থেকে আপনার ক্লাসে ডেটা পাওয়ার সময় যদি কোনো কাস্টম লজিক প্রয়োগ করতে হয়, তবে TypeAdapter ব্যবহার করতে পারেন।
  3. একাধিক টাইপের জন্য একক কাস্টম অ্যাডাপ্টার: TypeAdapterFactory এর মাধ্যমে একাধিক টাইপের জন্য কাস্টম অ্যাডাপ্টার তৈরি করা যেতে পারে।
  • TypeAdapter Gson এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে কাস্টম সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন লজিক প্রয়োগ করতে সাহায্য করে।
  • আপনি কাস্টম TypeAdapter ক্লাস বা TypeAdapterFactory ব্যবহার করে JSON থেকে Java অবজেক্টে রূপান্তর বা Java অবজেক্ট থেকে JSON রূপান্তর করতে পারেন।
Content added By

Gson TypeAdapter হলো Gson লাইব্রেরির একটি শক্তিশালী ফিচার, যা কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন প্রক্রিয়া কাস্টমাইজ করতে সাহায্য করে। এটি Gson এর ডিফল্ট আচরণের বাইরে গিয়ে, আপনি যখন বিশেষ ধরনের JSON স্ট্রাকচার বা Java অবজেক্টের সাথে কাজ করতে চান, তখন TypeAdapter একটি গুরুত্বপূর্ণ ভূমিকা পালন করে।

Gson TypeAdapter কি?

TypeAdapter একটি কাস্টম ক্লাস যা আপনাকে কাস্টম সিরিয়ালাইজেশন (অর্থাৎ, Java অবজেক্টকে JSON এ রূপান্তর) এবং ডেসিরিয়ালাইজেশন (JSON কে Java অবজেক্টে রূপান্তর) কনফিগার করতে দেয়। Gson এর ডিফল্ট behavior অনেক ক্ষেত্রেই কাজ করে, তবে কিছু সময় বিশেষ রূপান্তরের প্রক্রিয়া প্রয়োজন হয়, এবং TypeAdapter সেসকল কাস্টম প্রক্রিয়া করতে ব্যবহৃত হয়।

TypeAdapter ইন্টারফেসটি দুইটি প্রধান মেথড প্রদান করে:

  1. write(JsonWriter out, T value) - এই মেথডটি Java অবজেক্টকে JSON এ রূপান্তর করতে ব্যবহৃত হয়।
  2. read(JsonReader in) - এই মেথডটি JSON ডাটা থেকে Java অবজেক্টে রূপান্তর করতে ব্যবহৃত হয়।

কেন TypeAdapter প্রয়োজন?

  1. কাস্টম সিরিয়ালাইজেশন ও ডেসিরিয়ালাইজেশন: কিছু সময় আপনি JSON ফরম্যাটে ডেটা লেখার বা পড়ার জন্য নির্দিষ্ট কাস্টম লজিক প্রয়োগ করতে চাইতে পারেন। উদাহরণস্বরূপ, যদি আপনি Date অবজেক্টে নির্দিষ্ট ফরম্যাটে তারিখ রূপান্তর করতে চান, তবে আপনি TypeAdapter ব্যবহার করতে পারেন।
  2. অস্বাভাবিক ডাটা ফরম্যাটের জন্য: আপনি যদি এমন কোনো ডাটা ফরম্যাটের সাথে কাজ করছেন যা Gson এর ডিফল্ট মডেল দ্বারা সমর্থিত না হয়, তবে TypeAdapter দিয়ে আপনি কাস্টম ফরম্যাটে JSON পার্স এবং রাইট করতে পারবেন।
  3. অবজেক্টের বিশেষ ক্ষেত্রের সাথে কাজ: আপনি যখন কোনো অবজেক্টের বিশেষ ক্ষেত্রের জন্য JSON পদ্ধতির পরিবর্তন করতে চান (যেমন, বিশেষ ধরনের মান বা ফিল্ডের জন্য নির্দিষ্ট ফরম্যাট প্রয়োগ), তখন TypeAdapter প্রয়োজন হতে পারে।

উদাহরণ:

ধরা যাক, আপনার একটি Person ক্লাস আছে যেখানে Date ফিল্ড রয়েছে এবং আপনি চাইছেন এই Date ফিল্ডটি কাস্টম ফরম্যাটে JSON-এ রূপান্তরিত হোক।

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

import com.google.gson.*;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

class Person {
    String name;
    Date birthDate;

    public Person(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }
}

class PersonTypeAdapter extends TypeAdapter<Person> {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public void write(JsonWriter out, Person person) throws IOException {
        out.beginObject();
        out.name("name").value(person.name);
        out.name("birthDate").value(dateFormat.format(person.birthDate));
        out.endObject();
    }

    @Override
    public Person read(JsonReader in) throws IOException {
        in.beginObject();
        String name = null;
        Date birthDate = null;

        while (in.hasNext()) {
            String currentName = in.nextName();
            if (currentName.equals("name")) {
                name = in.nextString();
            } else if (currentName.equals("birthDate")) {
                birthDate = dateFormat.parse(in.nextString());
            }
        }
        in.endObject();
        return new Person(name, birthDate);
    }
}

Step 2: GsonBuilder এ TypeAdapter রেজিস্টার করা

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.Date;

public class GsonTypeAdapterExample {
    public static void main(String[] args) throws Exception {
        // Person অবজেক্ট তৈরি করা
        Person person = new Person("John Doe", new SimpleDateFormat("yyyy-MM-dd").parse("1990-05-15"));

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

        // Person অবজেক্ট 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.name + ", " + deserializedPerson.birthDate);
    }
}

আউটপুট:

Serialized JSON: {"name":"John Doe","birthDate":"1990-05-15"}
Deserialized Person: John Doe, Mon May 15 00:00:00 IST 1990

ব্যাখ্যা:

  1. PersonTypeAdapter কাস্টম TypeAdapter, যেখানে write মেথডটি Person অবজেক্টের birthDate ফিল্ডকে নির্দিষ্ট ফরম্যাটে JSON এ রূপান্তরিত করে এবং read মেথডটি JSON থেকে সেই ফরম্যাটে তারিখটি রূপান্তর করে।
  2. GsonBuilder().registerTypeAdapter() ব্যবহার করে Gson এ কাস্টম TypeAdapter রেজিস্টার করা হয়েছে, যাতে Person অবজেক্টে কাস্টম রূপান্তর করা যায়।

TypeAdapter এর আরও কিছু ব্যবহার:

  1. কাস্টম ফিল্ড নাম: যদি আপনি JSON এর ফিল্ড নাম পরিবর্তন করতে চান (যেমন snake_case থেকে camelCase এ), তাহলে TypeAdapter দিয়ে তা কাস্টমাইজ করা যায়।
  2. কাস্টম ফিল্ডের ডেটা রূপান্তর: যদি কোনো ফিল্ডের ডেটার জন্য আপনি একটি নির্দিষ্ট রূপান্তর চান (যেমন, একটা BigDecimal ফিল্ডকে JSON এ String হিসেবে প্রেরণ করা), TypeAdapter এর মাধ্যমে এটি করা সম্ভব।
  3. নেস্টেড অবজেক্ট: যদি আপনি কোনো নেস্টেড অবজেক্টের JSON রূপান্তর কাস্টমাইজ করতে চান, TypeAdapter ব্যবহার করে সেটা করতে পারবেন।

Gson TypeAdapter একটি খুবই শক্তিশালী টুল, যা আপনাকে কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন প্রয়োগের সুযোগ দেয়। এটি বিশেষভাবে উপকারী যখন:

  • ডিফল্ট Gson পার্সিং যথেষ্ট নয়।
  • JSON ডাটা বা Java অবজেক্টে কিছু বিশেষ কাস্টম লজিক প্রয়োগ করতে হয়।
  • বিশেষ JSON ফরম্যাট বা ডেটা টাইপের জন্য কাস্টম রূপান্তর প্রয়োজন।

TypeAdapter ব্যবহারের মাধ্যমে, আপনি Gson লাইব্রেরির পূর্ণ ক্ষমতা ব্যবহার করে নিজের কাঙ্ক্ষিত JSON আউটপুট বা ইনপুট তৈরি করতে পারেন।

Content added By

Gson এর Custom TypeAdapter একটি শক্তিশালী ফিচার যা আপনাকে JSON ডেটার Serialization এবং Deserialization প্রক্রিয়াকে কাস্টমাইজ করার সুযোগ দেয়। আপনি যখন Gson ব্যবহার করেন, তখন ডিফল্টভাবে এটি সাধারণ Object গুলি JSON-এ কনভার্ট বা JSON থেকে Object-এ কনভার্ট করে, তবে Custom TypeAdapter এর মাধ্যমে আপনি আরও কাস্টম রূপান্তর করতে পারেন।

TypeAdapter কাস্টম Serialization এবং Deserialization লজিক নির্দিষ্ট টাইপের জন্য প্রদান করে।

Custom TypeAdapter তৈরি করা:

1. Custom Serialization এবং Deserialization (Serialization এবং Deserialization কাস্টমাইজ করা)

ধরা যাক, আপনার একটি Person ক্লাস আছে এবং আপনি এটি JSON-এ কনভার্ট করতে চান, তবে আপনি কিছু বিশেষ ফরম্যাটে name বা birthDate ফিল্ড দেখতে চান। এজন্য আপনাকে একটি কাস্টম TypeAdapter তৈরি করতে হবে।

2. Person ক্লাস উদাহরণ:

import java.util.Date;

public class Person {
    private String name;
    private int age;
    private Date birthDate;

    // Constructor, getters, and setters
    public Person(String name, int age, Date birthDate) {
        this.name = name;
        this.age = age;
        this.birthDate = birthDate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }
}

3. Custom TypeAdapter তৈরি করা:

Person ক্লাসের জন্য একটি কাস্টম TypeAdapter তৈরি করতে হবে যা Serialization এবং Deserialization কাস্টমাইজ করবে।

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

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());

        // কাস্টম Date ফরম্যাটিং
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        out.name("birthDate").value(sdf.format(person.getBirthDate()));

        out.endObject();
    }

    @Override
    public Person read(JsonReader in) throws IOException {
        String name = null;
        int age = 0;
        Date birthDate = null;

        in.beginObject();
        while (in.hasNext()) {
            String fieldName = in.nextName();
            if (fieldName.equals("name")) {
                name = in.nextString();
            } else if (fieldName.equals("age")) {
                age = in.nextInt();
            } else if (fieldName.equals("birthDate")) {
                String dateString = in.nextString();
                try {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    birthDate = sdf.parse(dateString);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        in.endObject();

        return new Person(name, age, birthDate);
    }
}

4. TypeAdapter রেজিস্টার করা Gson-এ:

TypeAdapter তৈরি করার পর, আপনাকে GsonBuilder ব্যবহার করে এটি রেজিস্টার করতে হবে।

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

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

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

        // Person অবজেক্ট JSON এ কনভার্ট করা
        String json = gson.toJson(person);
        System.out.println(json);

        // JSON থেকে Person অবজেক্টে রূপান্তর করা
        String personJson = "{\"name\":\"John Doe\",\"age\":30,\"birthDate\":\"2024-12-19\"}";
        Person newPerson = gson.fromJson(personJson, Person.class);
        System.out.println(newPerson.getName() + ", " + newPerson.getAge());
    }
}

5. আউটপুট:

{
  "name": "John Doe",
  "age": 30,
  "birthDate": "2024-12-19"
}

6. কাস্টম TypeAdapter এর সুবিধা:

  • Serialization: PersonTypeAdapter ক্লাসে write মেথডটি কাস্টম JSON ফরম্যাট তৈরি করে, যেমন birthDate ফিল্ডটি কাস্টম ফরম্যাটে (yyyy-MM-dd) JSON-এ রূপান্তরিত হয়েছে।
  • Deserialization: read মেথডটি JSON থেকে Person অবজেক্টে কাস্টম ফরম্যাট অনুযায়ী রূপান্তর করে।

7. এটা কোথায় কাজে আসবে?

  • যখন আপনি একটি complex বা custom ডেটা ফরম্যাটের জন্য JSON তৈরি বা পার্স করতে চান।
  • যখন JSON ডেটার কিছু নির্দিষ্ট অংশ (যেমন, ডেটা ফরম্যাট) আপনাকে কাস্টমাইজ করতে হয়।
  • যখন আপনাকে ডেটা কনভার্ট করার সময় JSON ফরম্যাটে কিছু বিশেষ পরিবর্তন বা ম্যানিপুলেশন করতে হয়।
  • Gson এর Custom TypeAdapter খুবই শক্তিশালী এবং নমনীয় টুল, যা আপনাকে JSON কনভার্ট করার প্রক্রিয়াকে কাস্টমাইজ করতে দেয়।
  • TypeAdapter ক্লাসের মাধ্যমে আপনি Serialization এবং Deserialization উভয়ই কাস্টমাইজ করতে পারবেন, যার ফলে আপনি JSON ডেটা প্রক্রিয়া খুবই নিয়ন্ত্রিতভাবে করতে পারবেন।
Content added By

Gson-এ Complex Object Serialization করার জন্য TypeAdapter একটি শক্তিশালী উপায়। TypeAdapter আপনাকে কাস্টম Serialization এবং Deserialization আচরণ তৈরি করতে দেয়, যখন আপনার Object গুলি জটিল (complex) হতে পারে এবং আপনি তাদের কাস্টম ফরম্যাটে JSON এ রূপান্তর করতে চান।

TypeAdapter ব্যবহার করে আপনি একটি জাভা অবজেক্টকে JSON এ রূপান্তর (serialize) এবং JSON থেকে জাভা অবজেক্টে রূপান্তর (deserialize) কাস্টমাইজ করতে পারেন। এটি JsonSerializer এবং JsonDeserializer এর চেয়ে অনেক বেশি নিয়ন্ত্রণ এবং নমনীয়তা প্রদান করে।

1. TypeAdapter ব্যবহার করার উদাহরণ

ধরা যাক, আমাদের একটি Complex Object রয়েছে, যেটি একটি Person এবং তার Address এর সাথে সম্পর্কিত। আমরা এই অবজেক্টগুলোর জন্য কাস্টম Serialization এবং Deserialization করতে চাই।

1.1 Complex Object তৈরি

class Address {
    private String street;
    private String city;

    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public String getCity() {
        return city;
    }
}

class Person {
    private String name;
    private int age;
    private Address address;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public Address getAddress() {
        return address;
    }
}

2. TypeAdapter তৈরি করা

TypeAdapter তৈরি করতে, আমাদের Person এবং Address ক্লাসের জন্য কাস্টম Serialization এবং Deserialization তৈরি করতে হবে।

2.1 Person এবং Address এর জন্য TypeAdapter তৈরি

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

class AddressTypeAdapter extends TypeAdapter<Address> {
    @Override
    public void write(JsonWriter out, Address address) throws IOException {
        out.beginObject();
        out.name("street").value(address.getStreet());
        out.name("city").value(address.getCity());
        out.endObject();
    }

    @Override
    public Address read(JsonReader in) throws IOException {
        String street = null;
        String city = null;

        in.beginObject();
        while (in.hasNext()) {
            String name = in.nextName();
            if (name.equals("street")) {
                street = in.nextString();
            } else if (name.equals("city")) {
                city = in.nextString();
            }
        }
        in.endObject();
        return new Address(street, city);
    }
}

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());

        // Serialize Address using the custom AddressTypeAdapter
        AddressTypeAdapter addressAdapter = new AddressTypeAdapter();
        out.name("address");
        addressAdapter.write(out, person.getAddress());

        out.endObject();
    }

    @Override
    public Person read(JsonReader in) throws IOException {
        String name = null;
        int age = 0;
        Address address = null;

        in.beginObject();
        while (in.hasNext()) {
            String fieldName = in.nextName();
            if (fieldName.equals("name")) {
                name = in.nextString();
            } else if (fieldName.equals("age")) {
                age = in.nextInt();
            } else if (fieldName.equals("address")) {
                AddressTypeAdapter addressAdapter = new AddressTypeAdapter();
                address = addressAdapter.read(in);
            }
        }
        in.endObject();
        return new Person(name, age, address);
    }
}

3. TypeAdapter কে GsonBuilder-এ নিবন্ধন (Registering the TypeAdapter)

এখন আমরা TypeAdapter গুলিকে GsonBuilder-এ নিবন্ধন (register) করবো, যাতে Gson-এ তাদের ব্যবহার করা যায়।

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

public class Main {
    public static void main(String[] args) {
        // একটি Person অবজেক্ট তৈরি
        Address address = new Address("123 Main St", "New York");
        Person person = new Person("John Doe", 30, address);

        // GsonBuilder ব্যবহার করে TypeAdapter নিবন্ধন
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Person.class, new PersonTypeAdapter())
                .registerTypeAdapter(Address.class, new AddressTypeAdapter())
                .create();

        // Serialize Person অবজেক্ট
        String json = gson.toJson(person);
        System.out.println("Serialized JSON: " + json);

        // Deserialize JSON থেকে Person অবজেক্ট
        Person deserializedPerson = gson.fromJson(json, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson.getName());
        System.out.println("Deserialized Address: " + deserializedPerson.getAddress().getStreet());
    }
}

আউটপুট:

Serialized JSON: {"name":"John Doe","age":30,"address":{"street":"123 Main St","city":"New York"}}
Deserialized Person: John Doe
Deserialized Address: 123 Main St

4. কাস্টম TypeAdapter দিয়ে বিভিন্ন Complex Objects Serialize এবং Deserialize করা

এভাবে TypeAdapter ব্যবহার করে আপনি Complex Objects কাস্টমভাবে serialize এবং deserialize করতে পারেন। এর সুবিধাগুলো হলো:

  • কাস্টম ফরম্যাট: আপনি JSON এ অবজেক্টের কোন তথ্য কিভাবে প্রদর্শিত হবে তা কাস্টমাইজ করতে পারবেন।
  • Nested Objects: Nested অবজেক্টগুলোকে কাস্টমভাবে Serialize এবং Deserialize করা সম্ভব।
  • বিশেষ ফরম্যাটিং: Date, Time, Enum বা অন্যান্য কমপ্লেক্স ডেটা টাইপের জন্য কাস্টম ফরম্যাটিং করতে পারবেন।

5. TypeAdapter এর অন্যান্য ব্যবহার:

  • Null Handling: TypeAdapter ব্যবহার করে আপনি null মানের জন্য কাস্টম আচরণ তৈরি করতে পারেন, যেমন null ভ্যালু না পাঠানো।
  • Custom Field Exclusion: আপনার JSON ডেটা থেকে বিশেষ কিছু ফিল্ড বাদ দেওয়া বা পরবর্তীতে এক্সক্লুড করা।

সারাংশ:

  • TypeAdapter একটি কাস্টমSerialization এবং Deserialization এর জন্য কার্যকরী উপায়, যা জটিল (complex) অবজেক্ট গুলিকে JSON এ কাস্টম ফরম্যাটে রূপান্ত

র করতে সাহায্য করে।

  • এটি nested objects, custom fields, এবং complex data types যেমন Date, Enum ইত্যাদির জন্য কাস্টম পদ্ধতি ব্যবহার করতে সক্ষম।
  • TypeAdapter আপনাকে JSON রিড এবং রাইট করার সময়ে পুরো ফ্লেক্সিবিলিটি দেয়, যেখানে আপনি JSON ফরম্যাট কাস্টমাইজ করতে পারেন।

এভাবে, TypeAdapter ব্যবহার করে আপনি যে কোন ধরনের complex object কে কাস্টম JSON ফরম্যাটে serialize এবং deserialize করতে পারেন।

Content added By

GsonTypeAdapterFactory একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে custom TypeAdapters তৈরি করার এবং বিভিন্ন ধরনের Java Object বা Custom Types এর জন্য তাদের ব্যবহার করার সুযোগ দেয়। TypeAdapterFactory এর মাধ্যমে আপনি generic types এবং complex object structures এর জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন লজিক লিখতে পারেন, এবং এটি TypeAdapter এর একটি ফ্যাক্টরি প্যাটার্ন হিসেবে কাজ করে। এই পদ্ধতিটি কাস্টমাইজড ডেটা ফরম্যাট, generic types, অথবা নেস্টেড অবজেক্ট টাইপগুলির জন্য উপযোগী।

TypeAdapter এবং TypeAdapterFactory এর মধ্যে পার্থক্য:

  • TypeAdapter: একক টেকনিকাল ক্লাস বা object type এর জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন।
  • TypeAdapterFactory: একাধিক ধরনের TypeAdapter তৈরির জন্য একটি ফ্যাক্টরি। এটি একাধিক ডেটা টাইপের জন্য একই TypeAdapter-কে অ্যাপ্লাই করার সুবিধা দেয়।

TypeAdapterFactory এর ব্যবহার

TypeAdapterFactory মূলত একাধিক টাইপের জন্য TypeAdapter তৈরি করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, যদি আপনি Date এবং LocalDateTime এর জন্য কাস্টম সিরিয়ালাইজার এবং ডেসেরিয়ালাইজার তৈরি করতে চান, তবে আপনি TypeAdapterFactory ব্যবহার করতে পারেন।


উদাহরণ: TypeAdapterFactory ব্যবহার করে কাস্টম TypeAdapter তৈরি করা

ধরা যাক, আমাদের একটি কাস্টম Date ফরম্যাট আছে এবং আমরা এটি কাস্টম TypeAdapter এর মাধ্যমে Date এবং LocalDateTime ফিল্ডে প্রয়োগ করতে চাই।

১. Custom TypeAdapter তৈরি করা

প্রথমে, আমরা Date এবং LocalDateTime এর জন্য কাস্টম TypeAdapter তৈরি করব।

import com.google.gson.*;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Main {

    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                .registerTypeAdapterFactory(new DateTypeAdapterFactory())  // Register custom TypeAdapterFactory
                .create();

        // JSON serialization
        MyClass myObject = new MyClass(new Date(), LocalDateTime.now());
        String json = gson.toJson(myObject);
        System.out.println(json);  // Output: {"date":"2024-12-19","localDateTime":"2024-12-19T12:34:56"}

        // JSON deserialization
        String jsonInput = "{\"date\":\"2024-12-19\",\"localDateTime\":\"2024-12-19T12:34:56\"}";
        MyClass deserializedObject = gson.fromJson(jsonInput, MyClass.class);
        System.out.println(deserializedObject.date);  // Output: 2024-12-19
        System.out.println(deserializedObject.localDateTime);  // Output: 2024-12-19T12:34:56
    }
}

class MyClass {
    Date date;
    LocalDateTime localDateTime;

    public MyClass(Date date, LocalDateTime localDateTime) {
        this.date = date;
        this.localDateTime = localDateTime;
    }
}

class DateTypeAdapterFactory implements TypeAdapterFactory {
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        // Check if the type is Date or LocalDateTime and return the appropriate TypeAdapter
        if (type.getRawType() == Date.class) {
            return (TypeAdapter<T>) new DateTypeAdapter();
        }
        if (type.getRawType() == LocalDateTime.class) {
            return (TypeAdapter<T>) new LocalDateTimeTypeAdapter();
        }
        return null;  // Return null for types that do not require custom serialization/deserialization
    }
}

class DateTypeAdapter extends TypeAdapter<Date> {
    private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public void write(JsonWriter out, Date value) throws IOException {
        out.value(format.format(value));  // Serialize Date to "yyyy-MM-dd" format
    }

    @Override
    public Date read(JsonReader in) throws IOException {
        try {
            return format.parse(in.nextString());  // Deserialize string to Date
        } catch (Exception e) {
            throw new JsonParseException(e);
        }
    }
}

class LocalDateTimeTypeAdapter extends TypeAdapter<LocalDateTime> {
    private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");

    @Override
    public void write(JsonWriter out, LocalDateTime value) throws IOException {
        out.value(value.format(formatter));  // Serialize LocalDateTime to "yyyy-MM-dd'T'HH:mm:ss"
    }

    @Override
    public LocalDateTime read(JsonReader in) throws IOException {
        return LocalDateTime.parse(in.nextString(), formatter);  // Deserialize string to LocalDateTime
    }
}

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

  1. MyClass ক্লাসে Date এবং LocalDateTime টাইপের ফিল্ড রয়েছে।
  2. DateTypeAdapterFactory একটি কাস্টম TypeAdapterFactory যা Date এবং LocalDateTime এর জন্য যথাক্রমে কাস্টম TypeAdapter প্রদান করে।
  3. DateTypeAdapter এবং LocalDateTimeTypeAdapter সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন লজিক বাস্তবায়ন করে। Date কে "yyyy-MM-dd" ফরম্যাটে এবং LocalDateTime কে "yyyy-MM-dd'T'HH:mm:ss" ফরম্যাটে সিরিয়ালাইজ ও ডেসেরিয়ালাইজ করা হচ্ছে।

কাস্টম TypeAdapterFactory এর সুবিধা:

  • Reusable: একাধিক টাইপের জন্য একই ধরনের TypeAdapter রেজিস্টার করা যায়।
  • Flexible: আপনি যে কোনও টাইপের জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন লজিক প্রয়োগ করতে পারেন।
  • Generic Types: TypeAdapterFactory ব্যবহার করে আপনি generic types এবং parameterized types এর জন্য TypeAdapter তৈরি করতে পারেন।

উদাহরণ: Generic TypeAdapterFactory

ধরা যাক, আপনার কাছে এমন একটি generic class রয়েছে যার জন্য আপনি TypeAdapter তৈরি করতে চান:

class Box<T> {
    T value;

    public Box(T value) {
        this.value = value;
    }
}

class GenericTypeAdapterFactory implements TypeAdapterFactory {
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        if (type.getRawType() == Box.class) {
            TypeAdapter<Object> elementAdapter = gson.getAdapter(Object.class);  // Use a default adapter for T
            return new TypeAdapter<T>() {
                @Override
                public void write(JsonWriter out, T value) throws IOException {
                    out.beginObject();
                    out.name("value");
                    elementAdapter.write(out, ((Box<?>) value).value);  // Serialize value inside Box
                    out.endObject();
                }

                @Override
                public T read(JsonReader in) throws IOException {
                    in.beginObject();
                    in.nextName();  // Skip the "value" field name
                    Object value = elementAdapter.read(in);  // Deserialize the value inside Box
                    in.endObject();
                    return (T) new Box<>(value);
                }
            };
        }
        return null;
    }
}

এখানে GenericTypeAdapterFactory একটি Box ক্লাসের জন্য কাস্টম TypeAdapter তৈরি করে যা Box এর ভ্যালু T সিরিয়ালাইজ এবং ডেসেরিয়ালাইজ করবে।


  • TypeAdapterFactory Gson-এ কাস্টম TypeAdapter তৈরি করার এবং একাধিক টাইপে প্রয়োগ করার জন্য একটি শক্তিশালী উপায়।
  • এটি generic types এবং complex object structures এর জন্য অত্যন্ত কার্যকর, যেখানে বিভিন্ন টাইপের জন্য একাধিক TypeAdapter প্রয়োজন।
  • TypeAdapterFactory এর মাধ্যমে আপনি Date, LocalDateTime, Box এবং অন্যান্য কাস্টম টাইপের জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন কাস্টমাইজ করতে পারেন।
Content added By
Promotion

Are you sure to start over?

Loading...