Object Serialization এবং Deserialization হলো দুটি প্রক্রিয়া যা জাভাতে অবজেক্টের অবস্থান সংরক্ষণ এবং পুনঃপ্রতিষ্ঠা (restore) করতে ব্যবহৃত হয়। Serializable Interface একটি গুরুত্বপূর্ণ জাভা ইন্টারফেস যা অবজেক্টকে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে সক্ষম করে।
Object Serialization এবং Deserialization এর ধারণা
- Serialization:
- Serialization হলো একটি অবজেক্টের অবস্থা (state) বা ডেটাকে বাইনারি ফর্ম্যাটে রূপান্তরিত করা যাতে সেটি সংরক্ষণ বা নেটওয়ার্কের মাধ্যমে প্রেরণ করা যায়।
- এর মাধ্যমে অবজেক্টের ডেটা একটি ফাইল বা স্ট্রিমে লেখার জন্য প্রস্তুত হয়।
- Deserialization:
- Deserialization হলো সিরিয়ালাইজড অবজেক্টকে পুনরায় প্রাপ্ত অবস্থা অনুযায়ী তার আসল অবজেক্টে রূপান্তর করা।
- এর মাধ্যমে বাইনারি ডেটা থেকে আসল অবজেক্ট পুনঃপ্রতিষ্ঠিত হয় এবং সেই অবজেক্টকে ব্যবহার করা যায়।
Serializable Interface
Serializable ইন্টারফেস একটি marker interface। এর অর্থ হলো এই ইন্টারফেসের মধ্যে কোনো মেথড নেই। এটি শুধুমাত্র একটি সিগন্যাল দেয় যে, এই ক্লাসের অবজেক্টগুলো সিরিয়ালাইজ করা যাবে।
Serializable Interface এর প্রয়োজনীয়তা
- Object Persistence: অবজেক্টকে দীর্ঘমেয়াদী স্টোরেজে সংরক্ষণ বা ফাইল সিস্টেমে লেখার জন্য সিরিয়ালাইজ করা প্রয়োজন।
- Communication Across Networks: যখন অবজেক্ট নেটওয়ার্কের মাধ্যমে ট্রান্সফার করতে হয় (যেমন Remote Method Invocation - RMI), তখন সিরিয়ালাইজেশন প্রয়োজন।
- Session Management: সেশন ডেটা সংরক্ষণ করতে যখন অবজেক্টগুলো ডাটাবেসে সংরক্ষণ করতে হয়, তখন সিরিয়ালাইজেশন ব্যবহৃত হয়।
Serializable Interface ব্যবহার করার উদাহরণ
১. Serializable Interface Implement করা
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private double salary;
// Constructor
public Employee(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
// Getters and Setters
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getSalary() {
return salary;
}
// To String method
@Override
public String toString() {
return "Employee [name=" + name + ", age=" + age + ", salary=" + salary + "]";
}
}
২. Serialization এবং Deserialization উদাহরণ
Serialization (Object to File)
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializationExample {
public static void main(String[] args) {
Employee emp = new Employee("Alice", 30, 100000.00);
try (FileOutputStream fileOut = new FileOutputStream("employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(emp); // Serialize object to file
System.out.println("Serialized data is saved in employee.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
}
Deserialization (File to Object)
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializationExample {
public static void main(String[] args) {
Employee emp = null;
try (FileInputStream fileIn = new FileInputStream("employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
emp = (Employee) in.readObject(); // Deserialize object from file
System.out.println("Deserialized Employee: " + emp);
} catch (IOException | ClassNotFoundException i) {
i.printStackTrace();
}
}
}
Serialization and Deserialization with Tuples
Tuples-এ ডেটা সংরক্ষণ এবং তার পর সিরিয়ালাইজেশন প্রক্রিয়া সহজভাবে করা যায়।
Tuples এবং Serialization:
Tuples ব্যবহার করে আপনি সহজে একটি অবজেক্টের একাধিক ভ্যালু (যেমন নাম, বয়স, পেশা) রাখতে পারেন এবং সেগুলো সিরিয়ালাইজ করতে পারেন। এটি সাধারণভাবে সংক্ষেপিত ডেটা স্টোরেজে সাহায্য করে।
উদাহরণ:
import org.javatuples.Pair;
import java.io.*;
public class TupleSerializationExample {
public static void main(String[] args) {
Pair<String, Integer> person = Pair.with("Alice", 30);
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person); // Serialize Tuple
System.out.println("Serialized Tuple: " + person);
} catch (IOException i) {
i.printStackTrace();
}
// Deserialization
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Pair<String, Integer> deserializedPerson = (Pair<String, Integer>) in.readObject();
System.out.println("Deserialized Tuple: " + deserializedPerson);
} catch (IOException | ClassNotFoundException i) {
i.printStackTrace();
}
}
}
Serializable Interface এর সুবিধা
- Persistence (অবজেক্ট সংরক্ষণ): অবজেক্টকে ফাইল বা ডেটাবেসে সংরক্ষণ করা সহজ হয়।
- Data Transfer: অবজেক্টকে নেটওয়ার্কের মাধ্যমে অন্য সিস্টেমে প্রেরণ করা সহজ হয় (যেমন RMI বা Web Services)।
- Efficient Data Management: অবজেক্টের ডেটা এক্সপোর্ট এবং ইম্পোর্ট করা দ্রুত এবং কার্যকর হয়।
- Comprehensive Object Handling: Complex Objects-কে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা সম্ভব।
Serializable Interface এর সীমাবদ্ধতা
- Compatibility Issue: যখন ক্লাসের স্ট্রাকচার পরিবর্তিত হয়, তখন
serialVersionUIDএর মাধ্যমে পুরনো অবজেক্টের সাথে সামঞ্জস্য রাখতে হয়। Non-Serializable Fields: কোনো ফিল্ড যদি
Serializableনা হয়, তবে সেটি সিরিয়ালাইজেশন প্রক্রিয়ায় সংরক্ষিত হবে না। এগুলিtransientকিওয়ার্ড দ্বারা নিষ্ক্রিয় করা যেতে পারে।উদাহরণ:
private transient String password;- Performance: সিরিয়ালাইজেশন ও ডেসিরিয়ালাইজেশন অপারেশনগুলি সময়সাপেক্ষ এবং বড় ডেটাসেটের জন্য এটি পারফরম্যান্সের জন্য ব্যয়বহুল হতে পারে।
Best Practices for Using Serializable Interface
Use
serialVersionUID:- ক্লাসে
serialVersionUIDপ্রদান করুন যাতে ক্লাসের সংস্করণ পরিবর্তন হলে আগের অবজেক্ট ডেসিরিয়ালাইজ করা যায়।
private static final long serialVersionUID = 1L;- ক্লাসে
- Transients Fields:
- যেসব ফিল্ড সিরিয়ালাইজ করতে চান না, সেগুলিকে
transientকিওয়ার্ড দিয়ে চিহ্নিত করুন।
- যেসব ফিল্ড সিরিয়ালাইজ করতে চান না, সেগুলিকে
- Optimizing Serialization:
- বড় অবজেক্টগুলো সিরিয়ালাইজ করার সময় কার্যকরভাবে স্টোরেজ এবং পারফরম্যান্স অপটিমাইজ করুন।
Serializable Interface জাভাতে অবজেক্টকে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার জন্য অপরিহার্য। এটি একটি অবজেক্টের ডেটা সংরক্ষণ এবং পুনঃপ্রতিষ্ঠা করতে সাহায্য করে। Tuples ব্যবহার করে সহজে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা যায়, যা ডেটা গোষ্ঠীভুক্ত করতে এবং অ্যাপ্লিকেশনের কার্যকারিতা উন্নত করতে কার্যকর।
Read more