Custom Type Adapter এর মাধ্যমে Polymorphism হ্যান্ডল করা

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

305

Gson এর Custom Type Adapter ব্যবহার করে আপনি polymorphism (অথবা বিভিন্ন ধরনের অবজেক্টের জন্য একই ধরনের ইন্টারফেস বা শ্রেণী) হ্যান্ডল করতে পারেন। polymorphism হ্যান্ডলিং তখন প্রয়োজন হয় যখন আপনার JSON ডাটা বিভিন্ন ধরনের অবজেক্ট ধারণ করে এবং আপনি চাইছেন যে Gson সেগুলিকে সঠিকভাবে ডেসিরিয়ালাইজ (পড়তে) ও সিরিয়ালাইজ (লিখতে) করতে পারে।

এটি সাধারনত বিভিন্ন ধরনের অবজেক্টের জন্য একই বেস ক্লাস বা ইন্টারফেস ব্যবহার করে JSON ডাটা তৈরি ও পড়ার সময় দরকার হয়। Gson এর ডিফল্ট ডেসিরিয়ালাইজেশন এবং সিরিয়ালাইজেশন পদ্ধতি polymorphic অবজেক্ট হ্যান্ডলিংয়ের জন্য প্রস্তুত নয়, তবে আপনি Custom Type Adapter তৈরি করে এটি হ্যান্ডল করতে পারেন।

উদাহরণ:

ধরা যাক, আপনার একটি বেস ক্লাস Animal আছে এবং তার দুটি সিড (derived) ক্লাস Dog এবং Cat রয়েছে। এইসব অবজেক্টের জন্য আপনাকে JSON স্ট্রাকচার হ্যান্ডল করতে হবে।

Step 1: বেস ক্লাস এবং derived ক্লাস তৈরি করা

class Animal {
    String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public String makeSound() {
        return "Some sound";
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    
    @Override
    public String makeSound() {
        return "Bark";
    }
}

class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
    
    @Override
    public String makeSound() {
        return "Meow";
    }
}

Step 2: Custom Type Adapter তৈরি করা

এখন, আপনাকে TypeAdapter তৈরি করতে হবে যাতে Dog এবং Cat অবজেক্টগুলো সঠিকভাবে ডেসিরিয়ালাইজ এবং সিরিয়ালাইজ হতে পারে।

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

class AnimalAdapter implements JsonSerializer<Animal>, JsonDeserializer<Animal> {

    @Override
    public JsonElement serialize(Animal src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        
        // Serialize the common field (name)
        jsonObject.addProperty("name", src.name);
        
        // Serialize the specific fields depending on the subclass type
        if (src instanceof Dog) {
            jsonObject.addProperty("type", "dog");
            jsonObject.addProperty("sound", src.makeSound());
        } else if (src instanceof Cat) {
            jsonObject.addProperty("type", "cat");
            jsonObject.addProperty("sound", src.makeSound());
        }
        
        return jsonObject;
    }

    @Override
    public Animal deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        String name = jsonObject.get("name").getAsString();
        String type = jsonObject.get("type").getAsString();

        // Create the correct subclass instance based on the 'type' field in the JSON
        if ("dog".equals(type)) {
            return new Dog(name);
        } else if ("cat".equals(type)) {
            return new Cat(name);
        } else {
            throw new JsonParseException("Unknown type: " + type);
        }
    }
}

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

এখন, GsonBuilder ব্যবহার করে কাস্টম TypeAdapter রেজিস্টার করতে হবে:

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

public class PolymorphismWithGson {
    public static void main(String[] args) {
        // Create a Dog and a Cat instance
        Animal dog = new Dog("Buddy");
        Animal cat = new Cat("Whiskers");

        // Create a Gson object with the custom TypeAdapter
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Animal.class, new AnimalAdapter())
                .create();

        // Serialize the Animal objects
        String dogJson = gson.toJson(dog);
        String catJson = gson.toJson(cat);

        System.out.println("Serialized Dog: " + dogJson);
        System.out.println("Serialized Cat: " + catJson);

        // Deserialize the JSON back into Animal objects
        Animal deserializedDog = gson.fromJson(dogJson, Animal.class);
        Animal deserializedCat = gson.fromJson(catJson, Animal.class);

        System.out.println("Deserialized Dog: " + deserializedDog.makeSound());
        System.out.println("Deserialized Cat: " + deserializedCat.makeSound());
    }
}

আউটপুট:

Serialized Dog: {"name":"Buddy","type":"dog","sound":"Bark"}
Serialized Cat: {"name":"Whiskers","type":"cat","sound":"Meow"}
Deserialized Dog: Bark
Deserialized Cat: Meow

ব্যাখ্যা:

  1. Custom TypeAdapter:
    • AnimalAdapter ক্লাসটি JsonSerializer এবং JsonDeserializer ইন্টারফেস ইমপ্লিমেন্ট করেছে।
    • serialize মেথড: এখানে Animal অবজেক্টের ধরন (subclass) অনুযায়ী JSON স্ট্রাকচার তৈরি করা হচ্ছে। Dog এবং Cat এর জন্য আলাদা "type" ফিল্ড দেওয়া হচ্ছে।
    • deserialize মেথড: এখানে JSON থেকে অবজেক্ট তৈরি করার সময় type ফিল্ডের মান দেখে সঠিক subclass (যেমন Dog বা Cat) নির্ধারণ করা হচ্ছে।
  2. GsonBuilder: registerTypeAdapter(Animal.class, new AnimalAdapter()) ব্যবহার করে আমরা Animal ক্লাসের জন্য কাস্টম TypeAdapter রেজিস্টার করেছি, যাতে Gson এর সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কাস্টম লজিক অনুসারে চলে।
  3. Polymorphic Serialization & Deserialization:
    • সিরিয়ালাইজেশনে, Dog এবং Cat এর মধ্যে পার্থক্য করতে "type" ফিল্ড ব্যবহার করা হয়েছে।
    • ডেসিরিয়ালাইজেশনে, "type" ফিল্ড দেখে সঠিক subclass নির্বাচন করা হয়েছে।
  • Polymorphism হ্যান্ডল করতে Gson এর Custom Type Adapter খুবই শক্তিশালী একটি পদ্ধতি।
  • আপনি যখন polymorphic অবজেক্টের জন্য JSON তৈরি বা JSON থেকে অবজেক্ট তৈরি করতে চান, তখন Custom TypeAdapter আপনাকে কাস্টম সিরিয়ালাইজেশন ও ডেসিরিয়ালাইজেশন লজিক প্রয়োগ করার সুযোগ দেয়।
  • এটি বিশেষভাবে উপকারী যখন আপনার অবজেক্টের ধরন ডায়নামিকভাবে পরিবর্তিত হয় এবং Gson ডিফল্টভাবে এটি হ্যান্ডল করতে পারে না।
Content added By
Promotion

Are you sure to start over?

Loading...