Object Serialization এবং Deserialization হলো জাভা প্রোগ্রামিংয়ে অবজেক্টের ডেটা ফাইল বা স্ট্রিমে রূপান্তর এবং পরবর্তীতে সেই ডেটা পুনরুদ্ধার করার প্রক্রিয়া। Serialization অবজেক্টের স্টেট (অথবা ডেটা)কে বাইনারি বা অন্য ফরম্যাটে রূপান্তরিত করে সংরক্ষণ করে, যাতে সেটি সঞ্চিত করা এবং অন্যান্য সিস্টেমে প্রেরণ করা যায়। আর Deserialization হল সেই ডেটা আবার একটি অবজেক্টে রূপান্তর করা।
Object Serialization এবং Deserialization এর উদ্দেশ্য
- ডেটা সংরক্ষণ: অবজেক্টের স্টেট সংরক্ষণ করতে (ফাইল, ডেটাবেস ইত্যাদিতে) Serialization ব্যবহার করা হয়।
- ডেটা ট্রান্সমিশন: অবজেক্ট অন্য সার্ভারে প্রেরণ করা (যেমন RMI, Sockets) বা নেটওয়ার্কের মাধ্যমে ডেটা ট্রান্সফার করার জন্য Serialization ব্যবহার করা হয়।
- অস্থায়ী স্টোরেজ: সফটওয়্যার আপ্লিকেশন বন্ধ হয়ে যাওয়ার পরও ডেটা পুনরুদ্ধার করতে Serialization ব্যবহার করা হয়।
Serialization এর প্রক্রিয়া
Serialization প্রক্রিয়া অবজেক্টের সমস্ত ডেটা (ফিল্ড) স্ট্রিমে রূপান্তর করে। যেকোনো অবজেক্টকে Serialize করতে হলে Serializable ইন্টারফেসটি ইমপ্লিমেন্ট করতে হয়।
Serializable ইন্টারফেস
Serializable একটি Marker Interface (কোনো মেথড নেই) যা কম্পাইলারকে জানায় যে অবজেক্টটি সিরিয়ালাইজ করা যাবে।
Serialization উদাহরণ
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter methods
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
ব্যাখ্যা:
Personক্লাসেSerializableইন্টারফেস ইমপ্লিমেন্ট করা হয়েছে, যা বলছে যে এই ক্লাসের অবজেক্ট সিরিয়ালাইজ করা যাবে।
Object Serialization (ফাইলের মধ্যে অবজেক্ট সেভ করা)
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 25);
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person); // Serialize the object
System.out.println("Serialized data is saved in person.ser");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ObjectOutputStreamব্যবহার করেPersonঅবজেক্টটি একটি ফাইলেperson.serসেভ করা হয়েছে।writeObject()মেথড অবজেক্টকে স্ট্রিমে রূপান্তর করে।
Deserialization (ফাইল থেকে অবজেক্ট পুনরুদ্ধার করা)
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
public class DeserializationExample {
public static void main(String[] args) {
Person person = null;
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
person = (Person) in.readObject(); // Deserialize the object
System.out.println("Deserialized Person: " + person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ObjectInputStreamব্যবহার করেperson.serফাইল থেকে অবজেক্টটি পুনরুদ্ধার করা হয়েছে।readObject()মেথড অবজেক্টকে পুনরুদ্ধার করে এবংPersonক্লাসে কাস্ট করে।
Serialization এবং Deserialization এর সুবিধা
- ডেটা স্টোরেজ:
- অবজেক্টের স্টেটকে ফাইল বা ডেটাবেসে সেভ করা যায়।
- ডেটা ট্রান্সফার:
- অবজেক্ট সহজে নেটওয়ার্কের মাধ্যমে প্রেরণ করা যায় (যেমন RMI, Sockets)।
- অস্থায়ী স্টোরেজ:
- অ্যাপ্লিকেশন বন্ধ হলে ডেটা সেভ এবং পরে পুনরুদ্ধার করা সম্ভব।
- অপরিবর্তনীয় ডেটা:
- Serialization অবজেক্টের ডেটা Immutable রাখে, যার ফলে ডেটা পরিবর্তন করার ঝুঁকি কমে।
Tuples এবং Serialization/Deserialization
Tuples ব্যবহার করে Serialization এবং Deserialization এ একাধিক ভ্যালু সঞ্চয় এবং পুনরুদ্ধার করা যায়। এটি ছোট এবং সোজা পথ দেয় যাতে ডেটার বিভিন্ন ভ্যালু একসাথে রাখা এবং পরে সেগুলোর পুনরুদ্ধার সহজ হয়।
Tuples ব্যবহার করে Serialization উদাহরণ
import org.javatuples.Pair;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
public class TupleSerializationExample {
public static void main(String[] args) {
// Creating a Tuple
Pair<String, Integer> personTuple = Pair.with("Alice", 25);
try (FileOutputStream fileOut = new FileOutputStream("personTuple.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(personTuple); // Serialize the Tuple
System.out.println("Serialized Tuple data is saved in personTuple.ser");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Tuples ব্যবহার করে Deserialization উদাহরণ
import org.javatuples.Pair;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
public class TupleDeserializationExample {
public static void main(String[] args) {
Pair<String, Integer> personTuple = null;
try (FileInputStream fileIn = new FileInputStream("personTuple.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
personTuple = (Pair<String, Integer>) in.readObject(); // Deserialize the Tuple
System.out.println("Deserialized Tuple: " + personTuple);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Best Practices for Serialization and Deserialization
- Serializable Interface:
- শুধুমাত্র সেই ক্লাসগুলিকে
Serializableইন্টারফেস ইমপ্লিমেন্ট করতে দিন যেগুলি সিরিয়ালাইজ হতে প্রয়োজন।
- শুধুমাত্র সেই ক্লাসগুলিকে
Transient Keyword:
- যদি কোনো ফিল্ড সিরিয়ালাইজ করতে না চান, তবে
transientকিওয়ার্ড ব্যবহার করুন।
private transient String password;- যদি কোনো ফিল্ড সিরিয়ালাইজ করতে না চান, তবে
Versioning:
- অবজেক্টের সিরিয়ালাইজড ফর্মের জন্য
serialVersionUIDব্যবহার করুন, যাতে ক্লাসের ভার্সন পরিবর্তন হলে সমস্যা না হয়।
private static final long serialVersionUID = 1L;- অবজেক্টের সিরিয়ালাইজড ফর্মের জন্য
- Security:
- Deserialization এ নিরাপত্তার জন্য
ObjectInputStreamএরreadObject()মেথডে নিরাপত্তা চেক যুক্ত করুন।
- Deserialization এ নিরাপত্তার জন্য
- Avoid Serialization for Sensitive Data:
- সংবেদনশীল ডেটা যেমন পাসওয়ার্ড বা ক্রেডেনশিয়াল সিরিয়ালাইজেশন থেকে বাদ দিন।
Object Serialization এবং Deserialization জাভাতে অবজেক্টের স্টেট সেভ এবং পুনরুদ্ধার করতে ব্যবহৃত হয়। Javatuples এর সাহায্যে এই ডেটা খুব সহজভাবে সংরক্ষণ এবং পুনরুদ্ধার করা যায়। Tuples এর মাধ্যমে একাধিক ভ্যালু একসাথে সঞ্চয় এবং পুনরুদ্ধার করা যায়, যা কোডের সরলতা এবং কার্যকারিতা বাড়ায়।
Read more