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
গুরুত্বপূর্ণ পয়েন্ট
@JsonTypeInfo:use: সাবক্লাস চিহ্নিত করতে কী ব্যবহার হবে। যেমন:Id.NAMEব্যবহার করলে নাম দিয়ে চিহ্নিত হবে।include: টাইপ ইনফরমেশন কোথায় থাকবে। সাধারণতAs.PROPERTYব্যবহার করা হয়।property: JSON ফিল্ডের নাম, যা টাইপ ইনফরমেশন রাখবে।
@JsonSubTypes:- সাবক্লাসগুলোর তালিকা এবং তাদের টাইপ নাম উল্লেখ করতে ব্যবহৃত হয়।
- Serialization এবং Deserialization:
- Object থেকে JSON করার সময় পলিমরফিক টাইপ ইনফরমেশন স্বয়ংক্রিয়ভাবে যোগ হয়।
- JSON থেকে Object করার সময় টাইপ ইনফরমেশন ব্যবহার করে সঠিক ক্লাসে রূপান্তর হয়।
- 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
Read more