সিরিয়ালাইজেশন (Serialization) হলো একটি প্রক্রিয়া যেখানে একটি অবজেক্টের স্টেট বা ডেটা বাইনারি ফরম্যাটে রূপান্তরিত করা হয়, যাতে সেটি ফাইল, ডাটাবেস বা নেটওয়ার্কে প্রেরণ করা যায়। Java তে Serializable ইন্টারফেস ব্যবহার করে অবজেক্ট সিরিয়ালাইজ করা হয়। সিরিয়ালাইজেশন এর বিপরীত প্রক্রিয়া হলো ডিসিরিয়ালাইজেশন (Deserialization), যার মাধ্যমে বাইনারি ফরম্যাট থেকে অবজেক্ট পুনরুদ্ধার করা হয়।
কেন সিরিয়ালাইজেশন প্রয়োজন?
- অবজেক্ট স্থায়ী রাখা: অবজেক্টের স্টেট বা ডেটা ফাইলে সংরক্ষণ করে রাখা যায় এবং পরবর্তীতে প্রোগ্রাম পুনরায় চালু হলে তা পুনরুদ্ধার করা যায়।
- ডেটা প্রেরণ: নেটওয়ার্কের মাধ্যমে অবজেক্টের ডেটা প্রেরণ করতে সিরিয়ালাইজেশন গুরুত্বপূর্ণ।
- ডাটাবেস স্টোরেজ: ডাটাবেসে অবজেক্ট সংরক্ষণ করতে সিরিয়ালাইজেশন ব্যবহার করা হয়।
- ক্যাশিং: অবজেক্টকে দ্রুত পুনরায় ব্যবহারের জন্য সিরিয়ালাইজ করা যায়।
সিরিয়ালাইজেশন কিভাবে কাজ করে?
Java তে একটি অবজেক্টকে সিরিয়ালাইজ করতে হলে সেই ক্লাসে Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হয়। Serializable ইন্টারফেসে কোনো মেথড নেই; এটি মার্কার ইন্টারফেস, যা কেবল অবজেক্টকে সিরিয়ালাইজযোগ্য হিসেবে চিহ্নিত করে।
উদাহরণ: অবজেক্ট সিরিয়ালাইজেশন
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Employee implements Serializable {
private static final long serialVersionUID = 1L; // সিরিয়াল ভার্সন ইউআইডি
String name;
int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializationExample {
public static void main(String[] args) {
Employee emp = new Employee("John Doe", 30);
try (FileOutputStream fileOut = new FileOutputStream("employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(emp); // অবজেক্ট সিরিয়ালাইজ করা
System.out.println("Employee object serialized successfully.");
} catch (IOException e) {
System.out.println("Serialization error: " + e.getMessage());
}
}
}
ব্যাখ্যা:
Employeeক্লাসেSerializableইন্টারফেস ইমপ্লিমেন্ট করা হয়েছে, যাemployee.serফাইলে সিরিয়ালাইজ করা হয়েছে।ObjectOutputStreamএর মাধ্যমে অবজেক্টটিwriteObject()মেথড ব্যবহার করে ফাইলে সংরক্ষণ করা হয়েছে।
ডিসিরিয়ালাইজেশন (Deserialization)
সিরিয়ালাইজ করা অবজেক্ট পুনরুদ্ধার করতে ObjectInputStream ব্যবহার করা হয়, যা বাইনারি ফাইল থেকে অবজেক্ট পুনরায় তৈরি করে।
উদাহরণ: অবজেক্ট ডিসিরিয়ালাইজেশন
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializationExample {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Employee emp = (Employee) in.readObject(); // অবজেক্ট ডিসিরিয়ালাইজ করা
System.out.println("Employee Name: " + emp.name);
System.out.println("Employee Age: " + emp.age);
} catch (IOException | ClassNotFoundException e) {
System.out.println("Deserialization error: " + e.getMessage());
}
}
}
ব্যাখ্যা:
ObjectInputStreamদিয়েemployee.serফাইল থেকে অবজেক্ট ডিসিরিয়ালাইজ করা হয়েছে।readObject()মেথডের মাধ্যমে ফাইল থেকে অবজেক্ট পড়া হয়েছে এবং অবজেক্টের প্রোপার্টি প্রিন্ট করা হয়েছে।
সিরিয়ালাইজেশন সংক্রান্ত গুরুত্বপূর্ণ বিষয়
serialVersionUID: প্রতিটি সিরিয়ালাইজেবল ক্লাসে একটি serialVersionUID ফিল্ড থাকতে পারে, যা অবজেক্টের ভার্সন নির্দেশ করে। কোনো পরিবর্তন হলে এই আইডি পরিবর্তন করা হয়, যা কম্প্যাটিবিলিটি নিশ্চিত করতে সহায়ক।
private static final long serialVersionUID = 1L;
transient কিওয়ার্ড: কোনো ফিল্ড যদি transient কিওয়ার্ড দ্বারা চিহ্নিত থাকে, তবে সেটি সিরিয়ালাইজ করা হয় না। এটি ব্যবহার করে সংবেদনশীল বা প্রয়োজনহীন ডেটা সিরিয়ালাইজ হওয়া থেকে রোধ করা যায়।
transient int socialSecurityNumber;
static ফিল্ড: static ফিল্ড সিরিয়ালাইজ করা হয় না কারণ এটি ক্লাসের সাথে সম্পর্কিত, অবজেক্টের সাথে নয়।
সিরিয়ালাইজেশন সংক্রান্ত কিছু সুবিধা এবং সীমাবদ্ধতা
সুবিধা
- অবজেক্ট স্থায়ী করা: সিরিয়ালাইজেশন ব্যবহার করে অবজেক্ট ফাইলে সংরক্ষণ করে স্থায়ী রাখা যায়।
- ডেটা শেয়ারিং সহজ: সিরিয়ালাইজেশন দ্বারা সহজেই অবজেক্টের ডেটা নেটওয়ার্কের মাধ্যমে প্রেরণ করা যায়।
- ক্যাশিং: অ্যাপ্লিকেশনের কিছু অংশে অবজেক্ট ক্যাশে রাখা যায় এবং প্রয়োজন অনুযায়ী ডিসিরিয়ালাইজ করে ব্যবহার করা যায়।
সীমাবদ্ধতা
- বড় অবজেক্টের জন্য অকার্যকর: বড় এবং জটিল অবজেক্ট সিরিয়ালাইজ করলে অনেক বেশি মেমোরি এবং সময় লাগে।
- কম্প্যাটিবিলিটি সমস্যা: সিরিয়ালাইজেবল ক্লাসে কোনো পরিবর্তন করলে ডিসিরিয়ালাইজেশনে সমস্যা হতে পারে, যদি
serialVersionUIDঠিকভাবে ব্যবহার না করা হয়। - নিরাপত্তা ঝুঁকি: ডিসিরিয়ালাইজেশন নিরাপত্তা ঝুঁকির কারণ হতে পারে যদি অবজেক্ট নির্ভরযোগ্য উৎস থেকে না আসে, কারণ এটি আক্রমণের সুযোগ সৃষ্টি করতে পারে।
উদাহরণ: Transient ফিল্ড ব্যবহার
class Employee implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int age;
transient int socialSecurityNumber; // এটি সিরিয়ালাইজ হবে না
public Employee(String name, int age, int ssn) {
this.name = name;
this.age = age;
this.socialSecurityNumber = ssn;
}
}
ব্যাখ্যা:
- এখানে
socialSecurityNumberফিল্ডটিtransientহওয়ায় এটি সিরিয়ালাইজ হবে না। - ডিসিরিয়ালাইজ করার সময় এই ফিল্ডের ডিফল্ট মান সেট হবে, যেমন ইন্টিজার হলে ০।
সারসংক্ষেপ
- সিরিয়ালাইজেশন হলো প্রক্রিয়া যেখানে অবজেক্টের ডেটা বাইনারি ফরম্যাটে রূপান্তরিত করা হয়, যাতে তা ফাইলে সংরক্ষণ বা নেটওয়ার্কের মাধ্যমে প্রেরণ করা যায়।
- ডিসিরিয়ালাইজেশন হলো বিপরীত প্রক্রিয়া, যা বাইনারি ফরম্যাট থেকে অবজেক্ট পুনরুদ্ধার করে।
Serializableইন্টারফেস এবংserialVersionUIDদিয়ে সিরিয়ালাইজেবল ক্লাস তৈরি করা হয়।transientকিওয়ার্ড ব্যবহার করে প্রয়োজনহীন ফিল্ডগুলোকে সিরিয়ালাইজ হওয়া থেকে বিরত রাখা যায়।
সিরিয়ালাইজেশন ব্যবহার করে অবজেক্ট স্থায়ী করা, নেটওয়ার্কে ডেটা শেয়ারিং এবং ডেটা স্টোরেজ সহজ হয়, যা অনেক অ্যাপ্লিকেশন ডেভেলপমেন্টে সহায়ক।