Polymorphic Serialization এবং Deserialization

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

311

Polymorphic Serialization এবং Deserialization Gson-এ এমন একটি কনসেপ্ট, যা ইনহেরিটেন্স বা ক্লাস হায়ারার্কি সম্পর্কিত অবজেক্টগুলোর জন্য ব্যবহার করা হয়। এই কনসেপ্টের মাধ্যমে আপনি একাধিক subclass (উপক্লাস) এবং তাদের পারেন্ট ক্লাস (superclass) সম্পর্কিত অবজেক্টগুলিকে JSON-এ সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারেন।

যতক্ষণ না আপনি Gson কনফিগারেশন ব্যবহার করে polymorphic (বিভিন্ন রকম) অবজেক্টকে JSON বা Java অবজেক্টে রূপান্তর করবেন, ততক্ষণ পর্যন্ত Gson ডিফল্টভাবে এই ধরনের অবজেক্টের মধ্যে পার্থক্য করতে পারে না। আপনাকে উপযুক্ত কাস্টম TypeAdapter বা JsonDeserializer/JsonSerializer তৈরি করতে হবে।

Polymorphic Serialization এবং Deserialization এর ধারণা:

ধরা যাক, আপনার কাছে একটি বেস ক্লাস Animal এবং এর দুটি সাবক্লাস Dog এবং Cat আছে। আপনাকে এই ক্লাসগুলোর অবজেক্টগুলি JSON-এ সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে হবে, তবে আপনার উদ্দেশ্য হলো যে, JSON স্ট্রিং থেকে Dog এবং Cat অবজেক্টের মধ্যে পার্থক্য করা।

1. Polymorphic Serialization:

এটি এমন একটি প্রক্রিয়া যেখানে superclass এবং subclass অবজেক্টগুলি JSON-এ সিরিয়ালাইজ করা হয়, কিন্তু আপনাকে JSON-এ ক্লাস টাইপ সংরক্ষণ করতে হবে যাতে সিরিয়ালাইজড অবজেক্টটি subtype চিহ্নিত করা যায়।

উদাহরণ:

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

// Superclass
class Animal {
    String name;

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

// Subclass 1
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
}

// Subclass 2
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
}

// Custom Serializer to handle polymorphic serialization
class AnimalSerializer implements JsonSerializer<Animal> {
    @Override
    public JsonElement serialize(Animal src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("name", src.name);

        // Serialize the specific type (Dog or Cat)
        if (src instanceof Dog) {
            jsonObject.addProperty("type", "Dog");
        } else if (src instanceof Cat) {
            jsonObject.addProperty("type", "Cat");
        }

        return jsonObject;
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog("Buddy");
        Animal cat = new Cat("Whiskers");

        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Animal.class, new AnimalSerializer()) // Register custom serializer
                        .create();

        // Serializing the polymorphic objects
        String dogJson = gson.toJson(dog);
        String catJson = gson.toJson(cat);

        System.out.println(dogJson);  // {"name":"Buddy","type":"Dog"}
        System.out.println(catJson);  // {"name":"Whiskers","type":"Cat"}
    }
}

আউটপুট:

{"name":"Buddy","type":"Dog"}
{"name":"Whiskers","type":"Cat"}

এখানে Dog এবং Cat অবজেক্টগুলি JSON-এ সিরিয়ালাইজ হচ্ছে, এবং তাদের type নামে একটি নতুন ফিল্ড যোগ করা হচ্ছে, যা তাদের ক্লাস টাইপ সংরক্ষণ করে।


2. Polymorphic Deserialization:

এই প্রক্রিয়ায় JSON ডেটা থেকে subclass বা superclass অবজেক্ট ডেসিরিয়ালাইজ করা হয়, যেখানে subtype চিহ্নিত করার জন্য JSON স্ট্রিংয়ের একটি অংশ ব্যবহার করা হয়।

উদাহরণ:

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

// Superclass
class Animal {
    String name;

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

// Subclass 1
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
}

// Subclass 2
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
}

// Custom Deserializer to handle polymorphic deserialization
class AnimalDeserializer implements JsonDeserializer<Animal> {
    @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();

        if (type.equals("Dog")) {
            return new Dog(name);
        } else if (type.equals("Cat")) {
            return new Cat(name);
        } else {
            return new Animal(name); // Default case
        }
    }
}

public class Main {
    public static void main(String[] args) {
        String dogJson = "{\"name\":\"Buddy\",\"type\":\"Dog\"}";
        String catJson = "{\"name\":\"Whiskers\",\"type\":\"Cat\"}";

        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Animal.class, new AnimalDeserializer()) // Register custom deserializer
                        .create();

        // Deserializing the JSON to respective objects
        Animal dog = gson.fromJson(dogJson, Animal.class);
        Animal cat = gson.fromJson(catJson, Animal.class);

        System.out.println(dog.getClass().getSimpleName() + ": " + dog.name);  // Dog: Buddy
        System.out.println(cat.getClass().getSimpleName() + ": " + cat.name);  // Cat: Whiskers
    }
}

আউটপুট:

Dog: Buddy
Cat: Whiskers

এখানে AnimalDeserializer কাস্টম ডেসিরিয়ালাইজার ব্যবহার করা হয়েছে যা JSON-এ থাকা "type" ফিল্ড থেকে ক্লাস টাইপ পঠন করে এবং যথাযথ subtype অবজেক্টে রূপান্তরিত করে।


3. Polymorphic Serialization এবং Deserialization একসাথে ব্যবহার:

এখন, আপনি যদি polymorphic অবজেক্ট সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে চান একই সময়, তাহলে Gson এর serializer এবং deserializer একসাথে ব্যবহার করতে হবে।

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

// Superclass
class Animal {
    String name;

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

// Subclass 1
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
}

// Subclass 2
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
}

// Custom Serializer
class AnimalSerializer implements JsonSerializer<Animal> {
    @Override
    public JsonElement serialize(Animal src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("name", src.name);

        if (src instanceof Dog) {
            jsonObject.addProperty("type", "Dog");
        } else if (src instanceof Cat) {
            jsonObject.addProperty("type", "Cat");
        }

        return jsonObject;
    }
}

// Custom Deserializer
class AnimalDeserializer implements JsonDeserializer<Animal> {
    @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();

        if (type.equals("Dog")) {
            return new Dog(name);
        } else if (type.equals("Cat")) {
            return new Cat(name);
        } else {
            return new Animal(name);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog("Buddy");
        Animal cat = new Cat("Whiskers");

        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Animal.class, new AnimalSerializer()) // Register custom serializer
                        .registerTypeAdapter(Animal.class, new AnimalDeserializer()) // Register custom deserializer
                        .create();

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

        System.out.println(dogJson);  // {"name":"Buddy","type":"Dog"}
        System.out.println(catJson);  // {"name":"Whiskers","type":"Cat"}

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

        System.out.println(deserializedDog.getClass().getSimpleName() + ": " + deserializedDog.name);
        System.out.println(deserializedCat.getClass().getSimpleName() + ": " + deserializedCat.name);
    }
}

আউটপুট:

{"name":"Buddy","type":"Dog"}
{"name":"Whiskers","type":"Cat"}
Dog: Buddy
Cat: Whiskers

এখানে polymorphic serialization এবং deserialization একসাথে কাজ করছে, যেখানে আমরা custom serializer এবং custom deserializer ব্যবহার করেছি।


সারসংক্ষেপ:

  1. Polymorphic Serialization: JsonSerializer ব্যবহার করে superclass এবং subclass অবজেক্টগুলোকে JSON-এ সিরিয়ালাইজ করা হয়, এবং তাদের টাইপের জন্য একটি অতিরিক্ত ফিল্ড (যেমন "type") ব্যবহার করা হয়।
  2. Polymorphic Deserialization: JsonDeserializer ব্যবহার করে JSON থেকে superclass এবং subclass অবজেক্ট ডেসিরিয়ালাইজ করা হয়, এবং JSON-এ থাকা টাইপ অনুযায়ী সঠিক অবজেক্টে রূপান্তর করা হয়।
  3. এই কৌশলটি সাধারণত ইনহেরিটেন্স সম্পর্কিত অবজেক্টগুলির জন্য ব্যবহৃত হয় যেখানে আপনি একটি ক্লাস হায়ারার্কি থেকে ডেটা প্রক্রিয়া করতে চান।
Content added By
Promotion

Are you sure to start over?

Loading...