Skill

Gson এর মাধ্যমে Subclasses এবং Superclasses হ্যান্ডল করা

Gson এর Runtime Type Adapter - জিসন (Gson) - Java Technologies

398

Gson দিয়ে Subclasses এবং Superclasses হ্যান্ডলিং একটি গুরুত্বপূর্ণ টপিক, কারণ অনেক সময় আপনার Java প্রোগ্রামে একাধিক ক্লাস বা অবজেক্টের হায়ারার্কি থাকতে পারে, যেখানে Superclass এবং Subclass গুলি ভিন্ন ধরনের অবজেক্ট রূপে পরিণত হয়। Gson এই ধরনের অবজেক্ট সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে সক্ষম, তবে সঠিকভাবে কাজ করতে হলে কিছু কাস্টম কনফিগারেশন প্রয়োজন হতে পারে।

Gson ডিফল্টভাবে Superclass এবং Subclass গুলি সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারে, তবে যদি আপনি Type Information সংরক্ষণ করতে চান বা কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করতে চান, তবে TypeAdapter বা TypeToken ব্যবহার করতে হবে।

এখানে আমরা আলোচনা করবো কিভাবে Gson দিয়ে Superclass এবং Subclass গুলি হ্যান্ডল করা যায়।


1. Basic Example: Superclass এবং Subclass with Gson

প্রথমে, একটি সাধারণ উদাহরণ দেখে নেই, যেখানে Superclass এবং Subclass গুলি Gson এর মাধ্যমে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হচ্ছে।

উদাহরণ: Superclass এবং Subclass হ্যান্ডলিং

import com.google.gson.*;

class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    String breed;

    Dog(String name, String breed) {
        super(name);
        this.breed = breed;
    }
}

public class Main {
    public static void main(String[] args) {
        // Subclass object (Dog)
        Dog dog = new Dog("Rex", "German Shepherd");

        // Gson দিয়ে Subclass এবং Superclass সিরিয়ালাইজেশন
        Gson gson = new Gson();
        String json = gson.toJson(dog);
        System.out.println("Serialized JSON: " + json);

        // JSON থেকে Subclass অবজেক্টে ডেসিরিয়ালাইজ করা
        Animal animal = gson.fromJson(json, Animal.class);
        System.out.println("Deserialized Object: " + animal.getClass().getSimpleName() + " - " + ((Dog) animal).name);
    }
}

আউটপুট:

Serialized JSON: {"name":"Rex","breed":"German Shepherd"}
Deserialized Object: Dog - Rex

ব্যাখ্যা:

  • এখানে Dog একটি subclass যা Animal superclass থেকে ইন্সপায়ার করা হয়েছে।
  • Gson Dog অবজেক্টকে সিরিয়ালাইজ করেছে এবং JSON আউটপুট হিসেবে name এবং breed প্রপার্টি অন্তর্ভুক্ত করেছে।
  • যখন আমরা JSON থেকে Animal অবজেক্টে ডেসিরিয়ালাইজ করি, তখন Gson স্বয়ংক্রিয়ভাবে Subclass (এখানে Dog) বোঝে এবং name প্রপার্টি থেকে ডেসিরিয়ালাইজেশন সম্পন্ন করে।

2. Type Information Preservation with Subclasses

যখন Superclass এবং Subclass গুলি সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হয়, তখন কখনো কখনো Type Information সংরক্ষণ করতে হয়। এই ক্ষেত্রে, @SerializedName অথবা TypeAdapter ব্যবহার করা যায়।

উদাহরণ: Type Information Preservation

import com.google.gson.*;

class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    String breed;

    Dog(String name, String breed) {
        super(name);
        this.breed = breed;
    }
}

class Cat extends Animal {
    int lives;

    Cat(String name, int lives) {
        super(name);
        this.lives = lives;
    }
}

public class Main {
    public static void main(String[] args) {
        // Subclass objects (Dog and Cat)
        Dog dog = new Dog("Rex", "Bulldog");
        Cat cat = new Cat("Whiskers", 9);

        // Gson দিয়ে Superclass এবং Subclass সহ Serialization এবং Type Information Preserve করা
        Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create();

        // Subclass objects Serialize করা
        String dogJson = gson.toJson(dog);
        String catJson = gson.toJson(cat);

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

        // JSON থেকে Superclass অবজেক্টে Deserialize করা (Type Information Preserve করা)
        Animal dogAnimal = gson.fromJson(dogJson, Animal.class);
        Animal catAnimal = gson.fromJson(catJson, Animal.class);

        System.out.println("Deserialized Dog: " + dogAnimal.getClass().getSimpleName() + " - " + ((Dog) dogAnimal).name);
        System.out.println("Deserialized Cat: " + catAnimal.getClass().getSimpleName() + " - " + ((Cat) catAnimal).name);
    }
}

আউটপুট:

Serialized Dog JSON: {"name":"Rex","breed":"Bulldog"}
Serialized Cat JSON: {"name":"Whiskers","lives":9}
Deserialized Dog: Dog - Rex
Deserialized Cat: Cat - Whiskers

ব্যাখ্যা:

  • Gson Dog এবং Cat Subclass অবজেক্টগুলিকে আলাদাভাবে JSON ফরম্যাটে সিরিয়ালাইজ করেছে।
  • JSON থেকে ডেসিরিয়ালাইজ করার সময় Gson স্বয়ংক্রিয়ভাবে যথাযথ Subclass ডেটা বুঝে রূপান্তর করেছে, কারণ Dog এবং Cat কাস্টম টাইপ ডেটা ধারণ করছে।

3. Custom Serialization and Deserialization for Subclasses

কখনো কখনো আপনার প্রয়োজন হতে পারে কাস্টম Serialization এবং Deserialization এর জন্য, যেখানে আপনি TypeAdapter ব্যবহার করে Subclass-এর জন্য কাস্টম আচরণ কনফিগার করতে পারেন।

উদাহরণ: Custom Serialization and Deserialization with TypeAdapter

import com.google.gson.*;

class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    String breed;

    Dog(String name, String breed) {
        super(name);
        this.breed = breed;
    }
}

class AnimalTypeAdapter implements JsonSerializer<Animal>, JsonDeserializer<Animal> {
    @Override
    public JsonElement serialize(Animal src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        if (src instanceof Dog) {
            Dog dog = (Dog) src;
            jsonObject.addProperty("type", "dog");
            jsonObject.addProperty("name", dog.name);
            jsonObject.addProperty("breed", dog.breed);
        }
        return jsonObject;
    }

    @Override
    public Animal deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        String type = jsonObject.get("type").getAsString();
        if ("dog".equals(type)) {
            String name = jsonObject.get("name").getAsString();
            String breed = jsonObject.get("breed").getAsString();
            return new Dog(name, breed);
        }
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        // Subclass object (Dog)
        Dog dog = new Dog("Rex", "Labrador");

        // Gson with custom TypeAdapter for Animal (SuperClass)
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Animal.class, new AnimalTypeAdapter())
                        .create();

        // Serialize using custom TypeAdapter
        String json = gson.toJson(dog);
        System.out.println("Custom Serialized JSON: " + json);

        // Deserialize using custom TypeAdapter
        Animal animal = gson.fromJson(json, Animal.class);
        System.out.println("Custom Deserialized Object: " + animal.getClass().getSimpleName() + " - " + ((Dog) animal).name);
    }
}

আউটপুট:

Custom Serialized JSON: {"type":"dog","name":"Rex","breed":"Labrador"}
Custom Deserialized Object: Dog - Rex

ব্যাখ্যা:

  • এখানে, AnimalTypeAdapter ব্যবহার করে আমরা Dog Subclass-এর জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন লজিক তৈরি করেছি।
  • JSON আউটপুটে type প্রপার্টি সংরক্ষিত করা হয়েছে, যা ডেসিরিয়ালাইজেশন সময় Subclass (Dog) নির্ধারণ করতে ব্যবহৃত হয়।

Gson এর মাধ্যমে Superclass এবং Subclass হ্যান্ডলিং সহজেই করা যায়, তবে কখনো কখনো কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন প্রয়োজন হতে পারে। আপনি TypeAdapter ব্যবহার করে Subclass এবং Superclass এর জন্য কাস্টম লজিক প্রয়োগ করতে পারেন, এবং Type Information সংরক্ষণ করে Subclass গুলিকে সঠিকভাবে ডেসিরিয়ালাইজ করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...