Custom Serializer/Deserializer তৈরি করার প্রয়োজন হতে পারে যখন আপনার জাভা অবজেক্টকে XML ফরম্যাটে রূপান্তরের সময় বিশেষ ধরনের কাস্টম লজিক প্রয়োগ করতে হয়। Spring OXM একটি সহজ উপায় প্রদান করে যেখানে আপনি JAXB বা অন্য যে কোন XML-ম্যাপিং লাইব্রেরি ব্যবহার করে কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার তৈরি করতে পারেন। এই কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার ব্যবহার করা হয় যখন ডেটার কিছু নির্দিষ্ট ফরম্যাট, স্টাইল বা কাঠামো প্রয়োজন।
Custom Serializer এবং Deserializer এর ধারণা
- Serializer: এটি জাভা অবজেক্টকে XML ফরম্যাটে রূপান্তর করে (Marshalling)।
- Deserializer: এটি XML ডেটাকে জাভা অবজেক্টে রূপান্তর করে (Unmarshalling)।
উদাহরণ: Custom Serializer এবং Deserializer তৈরি করা
এখানে আমরা একটি কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার তৈরি করব, যা Date ফিল্ডকে একটি নির্দিষ্ট ফরম্যাটে রূপান্তর করবে।
১. Custom Serializer তৈরি
ধরা যাক আমাদের একটি Employee ক্লাস আছে, এবং এতে একটি Date ফিল্ড রয়েছে, যার মান XML আউটপুটে একটি নির্দিষ্ট ফরম্যাটে প্রদর্শন করতে হবে। এটি করার জন্য আমরা JAXB এর মাধ্যমে কাস্টম সিরিয়ালাইজার তৈরি করব।
১.১. Date ফিল্ডের জন্য Custom Serializer:
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.text.SimpleDateFormat;
import java.util.Date;
// Custom Serializer for Date
public class DateAdapter extends XmlAdapter<String, Date> {
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
public Date unmarshal(String v) throws Exception {
return dateFormat.parse(v);
}
@Override
public String marshal(Date v) throws Exception {
return dateFormat.format(v);
}
}
এই DateAdapter ক্লাসের মাধ্যমে, আপনি Date ফিল্ডকে yyyy-MM-dd ফরম্যাটে কনভার্ট করতে পারবেন। marshal() মেথডটি Date অবজেক্টকে XML স্ট্রিং এ রূপান্তর করবে, এবং unmarshal() মেথডটি XML স্ট্রিংকে Date অবজেক্টে রূপান্তর করবে।
১.২. Employee ক্লাসে কাস্টম সিরিয়ালাইজার প্রয়োগ করা
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.Date;
@XmlRootElement
public class Employee {
private int id;
private String name;
private Date hireDate;
@XmlElement
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
@XmlJavaTypeAdapter(DateAdapter.class) // Custom Adapter applied here
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
}
এখানে, @XmlJavaTypeAdapter(DateAdapter.class) অ্যানোটেশনটি Date ফিল্ডের উপর প্রয়োগ করা হয়েছে, যা কাস্টম সিরিয়ালাইজার (DateAdapter) ব্যবহার করবে।
২. Custom Deserializer তৈরি
ডেসিরিয়ালাইজারের কাজ হলো XML ডেটা থেকে জাভা অবজেক্ট তৈরি করা। নিচে কাস্টম ডেসিরিয়ালাইজার তৈরি করার উদাহরণ দেওয়া হলো, যেটি XML ফরম্যাট থেকে Date অবজেক্টে রূপান্তর করবে।
২.১. DateAdapter ডেসিরিয়ালাইজারের জন্য
DateAdapter ক্লাসটি আগেই তৈরি করা হয়েছে, এবং এটি unmarshal() মেথডের মাধ্যমে XML স্ট্রিং থেকে Date অবজেক্টে রূপান্তর করবে।
৩. Marshalling এবং Unmarshalling এর মাধ্যমে Custom Serializer/Deserializer পরীক্ষা করা
Marshalling (Java Object to XML):
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
import java.util.Date;
public class MarshallingExample {
public static void main(String[] args) throws Exception {
// Employee অবজেক্ট তৈরি করা
Employee employee = new Employee();
employee.setId(101);
employee.setName("John Doe");
employee.setHireDate(new SimpleDateFormat("yyyy-MM-dd").parse("2024-12-19"));
// Jaxb2Marshaller ইনস্ট্যান্স তৈরি করা
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(Employee.class);
// XML আউটপুট লেখার জন্য StringWriter তৈরি করা
StringWriter writer = new StringWriter();
// Marshalling প্রক্রিয়া: Employee অবজেক্টকে XML-এ রূপান্তরিত করা
marshaller.marshal(employee, new StreamResult(writer));
// XML আউটপুট প্রিন্ট করা
System.out.println("XML Output: \n" + writer.toString());
}
}
Unmarshalling (XML to Java Object):
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import javax.xml.transform.stream.StreamSource;
import java.io.StringReader;
public class UnmarshallingExample {
public static void main(String[] args) throws Exception {
String xml = "<employee><id>101</id><name>John Doe</name><hireDate>2024-12-19</hireDate></employee>";
// Jaxb2Marshaller ইনস্ট্যান্স তৈরি করা
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(Employee.class);
// Unmarshalling প্রক্রিয়া: XML থেকে Employee অবজেক্টে রূপান্তর
Employee employee = (Employee) marshaller.unmarshal(new StreamSource(new StringReader(xml)));
// Employee ডেটা প্রদর্শন করা
System.out.println("Employee ID: " + employee.getId());
System.out.println("Employee Name: " + employee.getName());
System.out.println("Employee Hire Date: " + new SimpleDateFormat("yyyy-MM-dd").format(employee.getHireDate()));
}
}
উপসংহার
Spring OXM-এর মাধ্যমে Custom Serializer এবং Deserializer তৈরি করলে আপনি XML ডেটার ফরম্যাটে বিশেষ কাস্টমাইজেশন প্রয়োগ করতে পারেন, যা সাধারণ XML রূপান্তরের চেয়ে বেশি নমনীয়তা প্রদান করে। কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার ব্যবহারের মাধ্যমে আপনি নিজের প্রয়োজন অনুযায়ী ডেটা রূপান্তর করতে পারেন, যেমন ডেটার ফরম্যাট পরিবর্তন করা বা বিশেষ ধরনের প্রক্রিয়া প্রয়োগ করা।
Read more