Object Serialization এবং Deserialization জাভাতে অবজেক্টের স্টেট (অথবা ডেটা) একটি স্ট্রিমে রূপান্তরিত করে স্টোর বা ট্রান্সফার করার প্রক্রিয়া। Serialization অবজেক্টকে একটি বাইনারি বা টেক্সট ফরম্যাটে রূপান্তর করে স্টোর করে, এবং Deserialization সেই রূপান্তরিত ডেটাকে আবার একটি অবজেক্টে রূপান্তর করে। এটি জাভা প্রোগ্রামগুলোর মধ্যে অবজেক্ট ট্রান্সফার করতে বা অবজেক্ট সেভ করতে ব্যবহৃত হয়।
Object Serialization এবং Deserialization এর প্রয়োজনীয়তা
- Data Persistence: অবজেক্টের স্টেট ডিস্কে সংরক্ষণ করে বা ডাটাবেসে রাখতে serialization ব্যবহার করা হয়।
- Network Communication: অবজেক্টের স্টেট নেটওয়ার্কের মাধ্যমে প্রেরণ করতে serialization ব্যবহৃত হয়।
- Inter-process Communication (IPC): একাধিক প্রক্রিয়ার মধ্যে অবজেক্ট ট্রান্সফার করতে serialization প্রয়োজন।
Object Serialization
জাভাতে Serialization করার জন্য অবজেক্টটি Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হয়। এটি একটি মার্কার ইন্টারফেস, যা বলে যে এই ক্লাসটি সিরিয়ালাইজ করা যাবে।
১. Object Serialization উদাহরণ
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
class Person implements java.io.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;
}
}
public class ObjectSerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
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();
}
}
}
ব্যাখ্যা:
Personক্লাসেSerializableইন্টারফেস ইমপ্লিমেন্ট করা হয়েছে, যার ফলে এটি সিরিয়ালাইজ করা যেতে পারে।ObjectOutputStreamব্যবহার করে অবজেক্টpersonফাইলেperson.serসিরিয়ালাইজ করা হয়েছে।
আউটপুট:
Serialized data is saved in person.ser
Object Deserialization
Deserialization হলো সিরিয়ালাইজ করা অবজেক্টকে তার মূল ফরম্যাটে রূপান্তরিত করা। এটি ObjectInputStream ব্যবহার করে করা হয়।
২. Object Deserialization উদাহরণ
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ObjectDeserializationExample {
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: ");
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ObjectInputStreamব্যবহার করে সিরিয়ালাইজ করা অবজেক্টperson.serফাইল থেকে ডেসিরিয়ালাইজ করা হয়েছে এবংPersonঅবজেক্ট পুনরুদ্ধার করা হয়েছে।- অবজেক্টের নাম এবং বয়স আউটপুট হিসাবে প্রদর্শিত হবে।
আউটপুট:
Deserialized Person:
Name: Alice
Age: 30
Tuples ব্যবহার করে Serialization এবং Deserialization
আপনি যদি Tuples ব্যবহার করে ডেটা সেভ এবং লোড করতে চান, তবে Serialization এবং Deserialization এর প্রক্রিয়া একই থাকবে। তবে, এখানে আমরা Pair বা Triplet মতো Tuples ব্যবহার করে Object সেভ এবং লোড করব।
৩. Tuple Serialization উদাহরণ
import org.javatuples.Pair;
import java.io.*;
public class TupleSerializationExample {
public static void main(String[] args) {
Pair<String, Integer> personTuple = Pair.with("Bob", 40);
try (FileOutputStream fileOut = new FileOutputStream("tuple.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(personTuple); // Serialize Tuple
System.out.println("Serialized Tuple data is saved in tuple.ser");
} catch (IOException e) {
e.printStackTrace();
}
}
}
৪. Tuple Deserialization উদাহরণ
import org.javatuples.Pair;
import java.io.*;
public class TupleDeserializationExample {
public static void main(String[] args) {
Pair<String, Integer> personTuple = null;
try (FileInputStream fileIn = new FileInputStream("tuple.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
personTuple = (Pair<String, Integer>) in.readObject(); // Deserialize Tuple
System.out.println("Deserialized Tuple: ");
System.out.println("Name: " + personTuple.getValue0());
System.out.println("Age: " + personTuple.getValue1());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- Tuple অবজেক্টটি Serialization এবং Deserialization প্রক্রিয়ার মধ্যে একটি সাধারণ Pair হিসেবে সেভ এবং লোড করা হয়েছে।
আউটপুট:
Serialized Tuple data is saved in tuple.ser
Deserialized Tuple:
Name: Bob
Age: 40
Serialization এবং Deserialization এর সুবিধা
- Data Persistence: অবজেক্টের ডেটা সেভ এবং রিট্রিভ করা যায়।
- Network Communication: অবজেক্টগুলো নেটওয়ার্কের মাধ্যমে পাঠানো যায় (যেমন RMI, Sockets)।
- Database Storage: অবজেক্টের ডেটা ডাটাবেসে সেভ করা যায়।
- Cross-platform Compatibility: এক প্ল্যাটফর্ম থেকে আরেক প্ল্যাটফর্মে অবজেক্ট ট্রান্সফার করা যায়।
Serialization এবং Deserialization এর সীমাবদ্ধতা
- Class Compatibility: ক্লাসের কোনও পরিবর্তন হলে, সিরিয়ালাইজড অবজেক্টের সাথে সমস্যা হতে পারে (যেমন,
serialVersionUIDমিসম্যাচ)। - Large Objects: বড় অবজেক্ট সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার সময় মেমরি ও কর্মক্ষমতা কমে যেতে পারে।
- Non-Serializable Classes: যেসব ক্লাস
Serializableইন্টারফেস ইমপ্লিমেন্ট করে না, সেগুলোর অবজেক্ট সিরিয়ালাইজ করা যায় না।
Best Practices
Use
serialVersionUID: সিরিয়ালাইজেশন সমস্যা এড়ানোর জন্য প্রতিটি সিরিয়ালাইজেবল ক্লাসেserialVersionUIDফিল্ড ব্যবহার করুন।private static final long serialVersionUID = 1L;Transient Keyword: যদি কিছু ডেটা সিরিয়ালাইজ করতে না চান, তবে তা
transientকিওয়ার্ড দিয়ে চিহ্নিত করুন।private transient int sensitiveData;- Avoid Large Objects: বড় অবজেক্ট সিরিয়ালাইজ করার আগে তাদের আকার ছোট করার চেষ্টা করুন।
Serialization এবং Deserialization Java প্রোগ্রামিংয়ে গুরুত্বপূর্ণ টুল যা অবজেক্টের ডেটা সংরক্ষণ এবং ট্রান্সফার করতে ব্যবহৃত হয়। Tuples এর সাথে এই প্রক্রিয়া একত্রে ব্যবহার করলে আপনি সহজেই জাভা অবজেক্ট এবং ডেটা স্ট্রাকচার সেভ এবং রিট্রিভ করতে পারেন। Javatuples এর মাধ্যমে Pair, Triplet ইত্যাদি Tuples সহজে Serialization এবং Deserialization প্রক্রিয়ার মধ্যে ব্যবহার করা যায়।
Read more