Polymorphic Serialization এবং Deserialization

Polymorphic Type Handling - জ্যাকসন (Jackson) - Java Technologies

280

Polymorphic Serialization এবং Deserialization হল এমন একটি পদ্ধতি, যেখানে একটি প্যারেন্ট ক্লাস বা ইন্টারফেসের ইনস্ট্যান্সকে JSON-এ রূপান্তর করা হয় এবং JSON থেকে পুনরায় সঠিক সাবক্লাস বা ইমপ্লিমেন্টেশন ক্লাস হিসেবে রূপান্তর করা হয়।

Jackson-এ এই কাজটি করতে আমরা সাধারণত @JsonTypeInfo এবং @JsonSubTypes এনোটেশন ব্যবহার করি।


কেন Polymorphic Serialization দরকার?

যখন আপনার একটি ক্লাস হায়ারার্কি থাকে (যেমন: একটি প্যারেন্ট ক্লাস এবং তার একাধিক চাইল্ড ক্লাস) এবং আপনি JSON ফাইল থেকে সঠিক সাবক্লাস ইনস্ট্যান্স পুনরায় তৈরি করতে চান।


ধাপ ১: ক্লাস হায়ারার্কি তৈরি করা

প্যারেন্ট ক্লাস এবং চাইল্ড ক্লাসগুলো তৈরি:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

// প্যারেন্ট ক্লাস
@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "type" // এই প্রোপার্টি সাবক্লাস চিহ্নিত করবে
)
@JsonSubTypes({
        @JsonSubTypes.Type(value = Car.class, name = "car"),
        @JsonSubTypes.Type(value = Truck.class, name = "truck")
})
abstract class Vehicle {
    private String brand;

    // Constructor, Getters, and Setters
    public Vehicle(String brand) {
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
}

// চাইল্ড ক্লাস ১
class Car extends Vehicle {
    private int seatingCapacity;

    public Car(String brand, int seatingCapacity) {
        super(brand);
        this.seatingCapacity = seatingCapacity;
    }

    public int getSeatingCapacity() {
        return seatingCapacity;
    }

    public void setSeatingCapacity(int seatingCapacity) {
        this.seatingCapacity = seatingCapacity;
    }
}

// চাইল্ড ক্লাস ২
class Truck extends Vehicle {
    private int loadCapacity;

    public Truck(String brand, int loadCapacity) {
        super(brand);
        this.loadCapacity = loadCapacity;
    }

    public int getLoadCapacity() {
        return loadCapacity;
    }

    public void setLoadCapacity(int loadCapacity) {
        this.loadCapacity = loadCapacity;
    }
}

ধাপ ২: ObjectMapper দিয়ে Serialization এবং Deserialization

Serialization (Object থেকে JSON):

import com.fasterxml.jackson.databind.ObjectMapper;

public class PolymorphicSerialization {
    public static void main(String[] args) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();

            // একটি Car Object তৈরি
            Vehicle car = new Car("Toyota", 5);

            // Car Object কে JSON-এ রূপান্তর
            String carJson = objectMapper.writeValueAsString(car);
            System.out.println("Car JSON: " + carJson);

            // একটি Truck Object তৈরি
            Vehicle truck = new Truck("Volvo", 10000);

            // Truck Object কে JSON-এ রূপান্তর
            String truckJson = objectMapper.writeValueAsString(truck);
            System.out.println("Truck JSON: " + truckJson);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

আউটপুট:

Car JSON: {"type":"car","brand":"Toyota","seatingCapacity":5}
Truck JSON: {"type":"truck","brand":"Volvo","loadCapacity":10000}

Deserialization (JSON থেকে Object):

import com.fasterxml.jackson.databind.ObjectMapper;

public class PolymorphicDeserialization {
    public static void main(String[] args) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();

            // Car JSON
            String carJson = "{\"type\":\"car\",\"brand\":\"Toyota\",\"seatingCapacity\":5}";

            // JSON থেকে Object
            Vehicle car = objectMapper.readValue(carJson, Vehicle.class);
            System.out.println("Deserialized Car: " + car.getClass().getSimpleName() + " - Brand: " + car.getBrand());

            // Truck JSON
            String truckJson = "{\"type\":\"truck\",\"brand\":\"Volvo\",\"loadCapacity\":10000}";

            // JSON থেকে Object
            Vehicle truck = objectMapper.readValue(truckJson, Vehicle.class);
            System.out.println("Deserialized Truck: " + truck.getClass().getSimpleName() + " - Brand: " + truck.getBrand());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

আউটপুট:

Deserialized Car: Car - Brand: Toyota
Deserialized Truck: Truck - Brand: Volvo

গুরুত্বপূর্ণ পয়েন্ট

  1. @JsonTypeInfo:
    • use: সাবক্লাস চিহ্নিত করতে কী ব্যবহার হবে। যেমন: Id.NAME ব্যবহার করলে নাম দিয়ে চিহ্নিত হবে।
    • include: টাইপ ইনফরমেশন কোথায় থাকবে। সাধারণত As.PROPERTY ব্যবহার করা হয়।
    • property: JSON ফিল্ডের নাম, যা টাইপ ইনফরমেশন রাখবে।
  2. @JsonSubTypes:
    • সাবক্লাসগুলোর তালিকা এবং তাদের টাইপ নাম উল্লেখ করতে ব্যবহৃত হয়।
  3. Serialization এবং Deserialization:
    • Object থেকে JSON করার সময় পলিমরফিক টাইপ ইনফরমেশন স্বয়ংক্রিয়ভাবে যোগ হয়।
    • JSON থেকে Object করার সময় টাইপ ইনফরমেশন ব্যবহার করে সঠিক ক্লাসে রূপান্তর হয়।
  4. Type Inclusion Options:
    • As.PROPERTY: JSON অবজেক্টের একটি ফিল্ড হিসেবে ইনফরমেশন থাকবে।
    • As.WRAPPER_OBJECT: JSON অবজেক্ট পুরো টাইপ ইনফরমেশন দিয়ে মোড়ানো থাকে।

উন্নত ব্যবহার: Global Configuration

ObjectMapper-এর মাধ্যমে গ্লোবাল কনফিগারেশন দিয়ে এই টাইপ ইনফরমেশন যুক্ত করা যায়:

ObjectMapper mapper = new ObjectMapper();
mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(),
        ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);

  • Jackson-এ Polymorphic Serialization এবং Deserialization জটিল ক্লাস হায়ারার্কি সহজে হ্যান্ডেল করতে সহায়তা করে।
  • @JsonTypeInfo এবং @JsonSubTypes ব্যবহার করে সাবক্লাসগুলোকে সহজে চিহ্নিত এবং JSON-এ রূপান্তর করা যায়।
  • বড় প্রজেক্টে এই কৌশলটি অত্যন্ত কার্যকর।
Content added By
Promotion

Are you sure to start over?

Loading...