Serialization হল একটি প্রক্রিয়া যার মাধ্যমে অবজেক্টকে একটি স্ট্রিমে রূপান্তরিত করা হয়, যাতে সেটি ফাইল সিস্টেমে সংরক্ষণ করা, অথবা নেটওয়ার্কের মাধ্যমে স্থানান্তর করা যায়। Java-তে সাধারণত Java Object Serialization ব্যবহার করে অবজেক্টগুলোকে বাইনারি ফরম্যাটে স্টোর বা ট্রান্সফার করা হয়।
যখন Custom Serialization প্রয়োগ করা হয়, তখন আমরা জাভার ডিফল্ট serialization mechanism পরিবর্তন করতে পারি। এর মাধ্যমে আমরা নির্দিষ্ট ভাবে কিভাবে অবজেক্টটি সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ হবে তা কাস্টমাইজ করতে পারি।
Custom Serialization কেন প্রয়োজন?
- বিশেষ ফিল্ড সিরিয়ালাইজ করা: কিছু ক্ষেত্রে অবজেক্টের কিছু ফিল্ড স্ট্যান্ডার্ড সিরিয়ালাইজেশনের মাধ্যমে সংরক্ষিত হওয়া উচিত নয়। আমরা Custom Serialization ব্যবহার করে নির্দিষ্ট ফিল্ডগুলো সিরিয়ালাইজ হতে রোধ করতে পারি।
- স্ট্রিমের আকার কমানো: কিছু ক্ষেত্রে, অবজেক্টের আকার বাড়ানোর পরিবর্তে কাস্টম ফরম্যাটে ডেটা সংরক্ষণ করা দরকার।
- কমপ্লেক্স অবজেক্ট লজিক: কোনো অবজেক্টের অবস্থা পুনরুদ্ধার করতে কাস্টম লজিক প্রয়োগ করা প্রয়োজন।
Custom Serialization Implement করার কৌশল
Java-তে Custom Serialization করতে হলে আপনাকে readObject() এবং writeObject() মেথডগুলোকে কাস্টমাইজ করতে হবে। এগুলি Serializable ইন্টারফেসের অংশ নয়, তবে আপনি এই মেথডগুলো নিজের ক্লাসে লিখে Serialization এবং Deserialization কাস্টমাইজ করতে পারবেন।
Custom Serialization এর উদাহরণ
Step 1: Serializable Interface Implement করা
আপনার ক্লাসে Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হবে যাতে জাভা জানে যে এই ক্লাসটি সিরিয়ালাইজযোগ্য।
Step 2: writeObject() এবং readObject() মেথড কাস্টমাইজ করা
এই মেথডগুলো আপনার কাস্টম সিরিয়ালাইজেশন লজিক বাস্তবায়ন করতে ব্যবহার করা হবে।
Custom Serialization উদাহরণ
কোড উদাহরণ:
import java.io.*;
import java.util.Date;
public class Employee implements Serializable {
private String name;
private transient int age; // Transient, means it won't be serialized
private Date birthDate;
public Employee(String name, int age, Date birthDate) {
this.name = name;
this.age = age;
this.birthDate = birthDate;
}
// Custom serialization
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject(); // default serialization of non-transient fields
// custom logic to serialize the 'age' field
oos.writeInt(age);
}
// Custom deserialization
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject(); // default deserialization of non-transient fields
// custom logic to deserialize the 'age' field
age = ois.readInt();
}
// Getter and Setter methods
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Date getBirthDate() {
return birthDate;
}
@Override
public String toString() {
return "Employee{name='" + name + "', age=" + age + ", birthDate=" + birthDate + '}';
}
public static void main(String[] args) {
Employee emp = new Employee("John", 30, new Date());
// Serializing the object to a file
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("employee.ser"))) {
oos.writeObject(emp);
System.out.println("Employee object serialized successfully.");
} catch (IOException e) {
e.printStackTrace();
}
// Deserializing the object from the file
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("employee.ser"))) {
Employee deserializedEmp = (Employee) ois.readObject();
System.out.println("Deserialized Employee: " + deserializedEmp);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Explanation:
transientkeyword:transientশব্দটি ফিল্ডের আগে ব্যবহৃত হলে, সেই ফিল্ডটি serialization প্রক্রিয়া থেকে বাদ পড়ে। আমাদের উদাহরণেageফিল্ডটিtransientহওয়ায় এটি serialize হয়নি।
writeObject()method:writeObject()মেথডে, আমরাdefaultWriteObject()কল করি যাতে সাধারণ অবজেক্ট ফিল্ডগুলি সিরিয়ালাইজ করা যায় এবং তারপরে আমরাageফিল্ডটিকে কাস্টমভাবে সিরিয়ালাইজ করি (এটিtransientহওয়ার কারণে ডিফল্টভাবে সিরিয়ালাইজ হবে না)।
readObject()method:readObject()মেথডে, আমরাdefaultReadObject()কল করি, যাতে সাধারণ অবজেক্ট ফিল্ডগুলি deserialized হয় এবং তারপরে আমরাageফিল্ডটিকে কাস্টমভাবে ডেসিরিয়ালাইজ করি।
- Custom Serialization আপনাকে আপনার অবজেক্টের serialization এবং deserialization প্রক্রিয়াকে কাস্টমাইজ করার সুযোগ দেয়।
writeObject()এবংreadObject()মেথডগুলি custom serialization এর জন্য ব্যবহৃত হয় এবং আপনি আপনার লজিক যোগ করতে পারেন, যেমনtransientফিল্ড সিরিয়ালাইজ না করা বা অন্যান্য কাস্টম ডেটা ফরম্যাট।- এটি বিশেষভাবে security, compression, অথবা specific data processing এর জন্য উপযুক্ত।
Java Tuples ব্যবহার করে আপনি serialized অবজেক্টের বিভিন্ন ফিল্ড সংরক্ষণ করতে পারেন এবং পরবর্তীতে tuple এর মাধ্যমে সেগুলি ব্যবহার করতে পারেন।
Read more