ObjectInputStream এবং ObjectOutputStream হল Java I/O প্যাকেজের দুটি গুরুত্বপূর্ণ ক্লাস যা serialization এবং deserialization এর জন্য ব্যবহৃত হয়। অর্থাৎ, এগুলি অবজেক্টগুলিকে ফাইল বা স্ট্রিমে সংরক্ষণ (serialization) এবং পুনরুদ্ধার (deserialization) করতে সাহায্য করে।
Serialization এবং Deserialization এর ধারণা:
- Serialization হল একটি অবজেক্টকে byte stream আকারে রূপান্তর করা, যাতে এটি ডিস্কে সংরক্ষণ বা নেটওয়ার্কের মাধ্যমে ট্রান্সফার করা যায়।
- Deserialization হল একটি serialized byte stream থেকে অবজেক্ট পুনরুদ্ধার করা, যাতে এটি আবার Java অবজেক্ট হিসেবে ব্যবহৃত হতে পারে।
ObjectInputStream এবং ObjectOutputStream এর ভূমিকা:
- ObjectOutputStream:
- এটি OutputStream এর একটি সাবক্লাস, যা অবজেক্টকে serialize করে এবং স্ট্রিম বা ফাইলে লেখে।
- এটি writeObject() মেথড ব্যবহার করে অবজেক্টটি serialize করে এবং ফাইলে লেখে।
- ObjectInputStream:
- এটি InputStream এর একটি সাবক্লাস, যা serialized অবজেক্ট পড়ে এবং পুনরুদ্ধার (deserialize) করে।
- এটি readObject() মেথড ব্যবহার করে অবজেক্টটি deserialize করে।
ObjectOutputStream এবং ObjectInputStream উদাহরণ
১. অবজেক্ট লেখা (Serialization) এবং পড়া (Deserialization)
এখানে একটি Person অবজেক্ট ObjectOutputStream ব্যবহার করে ফাইলে লেখা হবে এবং পরে ObjectInputStream ব্যবহার করে ফাইল থেকে অবজেক্টটি পড়া হবে।
import java.io.*;
// Person ক্লাস যা Serializable ইন্টারফেস ইমপ্লিমেন্ট করবে
class Person implements Serializable {
String name;
int age;
// কনস্ট্রাক্টর
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// টু স্ট্রিং মেথড
@Override
public String toString() {
return "Name: " + name + ", Age: " + age;
}
}
public class ObjectStreamExample {
public static void main(String[] args) {
// অবজেক্টকে ফাইলে লেখা
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
Person person = new Person("John", 30);
oos.writeObject(person); // অবজেক্ট লেখা
System.out.println("Person object serialized to person.ser");
} catch (IOException e) {
e.printStackTrace();
}
// অবজেক্টকে ফাইল থেকে পড়া
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject(); // অবজেক্ট পুনরুদ্ধার
System.out.println("Person object deserialized from person.ser");
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- Person ক্লাসটি
Serializableইন্টারফেস ইমপ্লিমেন্ট করেছে, যার মাধ্যমে অবজেক্টটি serialize এবং deserialize করা যাবে। ObjectOutputStreamদ্বারা Person অবজেক্ট ফাইলের মধ্যেperson.serনামক ফাইলে serialize করা হচ্ছে।ObjectInputStreamদ্বারা সেই ফাইল থেকে অবজেক্টটি deserialize করা হচ্ছে এবং কনসোলে আউটপুট হিসেবে Person অবজেক্টের তথ্য প্রদর্শন করা হচ্ছে।
আউটপুট:
Person object serialized to person.ser
Person object deserialized from person.ser
Name: John, Age: 30
2. Multiple Objects Serialization and Deserialization
একাধিক অবজেক্টকে একই ফাইলে serialize এবং deserialize করার উদাহরণ:
import java.io.*;
class Book implements Serializable {
String title;
String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
@Override
public String toString() {
return "Title: " + title + ", Author: " + author;
}
}
public class MultipleObjectsSerialization {
public static void main(String[] args) {
// একাধিক অবজেক্ট ফাইলে লেখা
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("books.ser"))) {
Book book1 = new Book("Java Programming", "John Doe");
Book book2 = new Book("Data Structures", "Jane Smith");
oos.writeObject(book1); // প্রথম বই অবজেক্ট লেখা
oos.writeObject(book2); // দ্বিতীয় বই অবজেক্ট লেখা
System.out.println("Books serialized to books.ser");
} catch (IOException e) {
e.printStackTrace();
}
// একাধিক অবজেক্ট ফাইল থেকে পড়া
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("books.ser"))) {
Book book1 = (Book) ois.readObject(); // প্রথম বই অবজেক্ট পুনরুদ্ধার
Book book2 = (Book) ois.readObject(); // দ্বিতীয় বই অবজেক্ট পুনরুদ্ধার
System.out.println("Books deserialized from books.ser");
System.out.println(book1);
System.out.println(book2);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- এখানে দুটি Book অবজেক্ট ObjectOutputStream ব্যবহার করে books.ser ফাইলে serialize করা হয়েছে।
- পরে ObjectInputStream ব্যবহার করে এই দুটি বইয়ের অবজেক্ট পুনরুদ্ধার (deserialize) করা হয়েছে।
আউটপুট:
Books serialized to books.ser
Books deserialized from books.ser
Title: Java Programming, Author: John Doe
Title: Data Structures, Author: Jane Smith
ObjectInputStream এবং ObjectOutputStream এর সুবিধা
- Serialization এবং Deserialization:
- এই ক্লাসগুলি Java অবজেক্টগুলি সহজে এবং কার্যকরীভাবে ফাইলে serialize এবং deserialize করার জন্য ব্যবহৃত হয়। এটি ফাইল সিস্টেমে অবজেক্ট সংরক্ষণ এবং পুনরুদ্ধারের জন্য অত্যন্ত কার্যকরী।
- প্রতিটি অবজেক্টের অবস্থা সংরক্ষণ:
- আপনি অবজেক্টের স্টেট (অবস্থা) একটি ফাইলে serialize করতে পারেন এবং পরবর্তীতে সেই অবজেক্টকে আবার একই স্টেটে deserialize করতে পারেন।
- বিভিন্ন ধরনের অবজেক্ট সংরক্ষণ:
writeObject()এবংreadObject()মেথডগুলি আপনাকে একাধিক অবজেক্ট ফাইলে স্টোর এবং পুনরুদ্ধার করতে সাহায্য করে।
ObjectInputStream এবং ObjectOutputStream এর সীমাবদ্ধতা
- Serializability এর প্রয়োজন:
- যেকোন অবজেক্ট যা serialize করা হবে, তাকে অবশ্যই
Serializableইন্টারফেস ইমপ্লিমেন্ট করতে হবে। যদি একটি ক্লাস এই ইন্টারফেসটি ইমপ্লিমেন্ট না করে, তবে এটিNotSerializableExceptionতৈরি করবে।
- যেকোন অবজেক্ট যা serialize করা হবে, তাকে অবশ্যই
- Versioning সমস্যা:
- যখন ক্লাসের স্ট্রাকচার পরিবর্তন করা হয় (যেমন নতুন ফিল্ড যোগ করা), তখন পুরনো serialized ডেটা পুনরুদ্ধারের সময় সমস্যা হতে পারে।
- পারফরম্যান্স:
- অবজেক্টগুলি serialize বা deserialize করার সময় কিছুটা performance overhead থাকতে পারে, বিশেষ করে বড় বা জটিল অবজেক্টের ক্ষেত্রে।
- ObjectInputStream এবং ObjectOutputStream Java-তে serialization এবং deserialization প্রক্রিয়া সহজ এবং কার্যকরীভাবে সম্পাদন করার জন্য ব্যবহৃত হয়।
- এগুলি আপনাকে Java objects ফাইলে write এবং read করার মাধ্যমে অবজেক্টের স্টেট সংরক্ষণ করতে সহায়ক।
- এই ক্লাসগুলি ফাইলের মাধ্যমে অবজেক্টের ডেটা স্টোর এবং পুনরুদ্ধার করার জন্য Binary I/O স্ট্রিমের উপর ভিত্তি করে কাজ করে এবং
Serializableইন্টারফেসের সাথে কাজ করে।
Content added By
Read more