Externalizable হল Java I/O-এর একটি ইন্টারফেস যা Serialization এবং Deserialization প্রক্রিয়ার জন্য ব্যবহৃত হয়। যখন একটি ক্লাস Externalizable ইন্টারফেস ইমপ্লিমেন্ট করে, তখন এটি ডেটা সংরক্ষণ (serialization) এবং পুনরুদ্ধার (deserialization) কাস্টমাইজ করতে পারে। Externalizable ইন্টারফেসে দুটি মেথড থাকে: writeExternal() এবং readExternal()।
Externalizable ইন্টারফেসটি Serializable ইন্টারফেসের একটি উন্নত সংস্করণ। যেখানে Serializable সাধারণত Java দ্বারা পরিচালিত হয়, Externalizable ক্লাসগুলোর ক্ষেত্রে আপনি নিজে কাস্টম কনট্রোল রাখতে পারেন, অর্থাৎ আপনি কীভাবে একটি অবজেক্ট সিরিয়ালাইজ হবে তা নির্ধারণ করতে পারেন।
Externalizable ইন্টারফেসের দুটি মেথড:
writeExternal(ObjectOutput out):- অবজেক্টের state স্ট্রীমে লেখার জন্য ব্যবহৃত হয়। এটি ObjectOutput টাইপের আর্গুমেন্ট গ্রহণ করে এবং অবজেক্টের ডেটা স্ট্রীমে লেখে।
readExternal(ObjectInput in):- অবজেক্টের state পুনরুদ্ধারের জন্য ব্যবহৃত হয়। এটি ObjectInput টাইপের আর্গুমেন্ট গ্রহণ করে এবং অবজেক্টের ডেটা পুনরুদ্ধার করে।
Externalizable এর উদাহরণ
এখানে একটি ক্লাস Person তৈরি করা হয়েছে, যা Externalizable ইন্টারফেস ইমপ্লিমেন্ট করে। এতে writeExternal() এবং readExternal() মেথড কাস্টমাইজ করা হয়েছে, যা অবজেক্টের ডেটা সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করবে।
import java.io.*;
public class Person implements Externalizable {
private String name;
private int age;
// Default constructor required for Externalizable interface
public Person() {
// Empty constructor is mandatory for Externalizable
}
// Parameterized constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// writeExternal method to customize serialization
@Override
public void writeExternal(ObjectOutput out) throws IOException {
// Writing custom object data to stream
out.writeObject(name);
out.writeInt(age);
}
// readExternal method to customize deserialization
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// Reading custom object data from stream
name = (String) in.readObject();
age = in.readInt();
}
// toString method to print object state
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) {
Person person = new Person("John Doe", 30);
System.out.println("Original Person: " + person);
// Serialize the object
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
person.writeExternal(oos); // Custom serialization
System.out.println("Person serialized successfully.");
} catch (IOException e) {
e.printStackTrace();
}
// Deserialize the object
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = new Person();
deserializedPerson.readExternal(ois); // Custom deserialization
System.out.println("Deserialized Person: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
writeExternal():writeObject()ব্যবহার করে অবজেক্টেরnameপ্রপার্টি এবংwriteInt()ব্যবহার করেageপ্রপার্টি স্ট্রিমে লেখার জন্য কাস্টমাইজ করা হয়েছে।
readExternal():readObject()ব্যবহার করে অবজেক্টেরnameএবংreadInt()ব্যবহার করেageপ্রপার্টি পুনরুদ্ধার করা হয়েছে।
- Serialization:
- অবজেক্ট
personপ্রথমে সিরিয়ালাইজ হচ্ছেperson.serফাইলে।
- অবজেক্ট
- Deserialization:
- পরবর্তীতে সেই ফাইল থেকে অবজেক্টটি পুনরুদ্ধার করা হচ্ছে এবং কনসোলে আউটপুট প্রদর্শন করা হচ্ছে।
আউটপুট:
Original Person: Person{name='John Doe', age=30}
Person serialized successfully.
Deserialized Person: Person{name='John Doe', age=30}
Externalizable এবং Serializable এর মধ্যে পার্থক্য:
| বিষয় | Serializable | Externalizable |
|---|---|---|
| স্বয়ংক্রিয় সিরিয়ালাইজেশন | Java নিজে সিরিয়ালাইজেশন প্রক্রিয়া পরিচালনা করে। | সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কাস্টমাইজ করা যায়। |
| বাধ্যতামূলক কনস্ট্রাক্টর | নেই | একটি ডিফল্ট কনস্ট্রাক্টর থাকতে হবে। |
| ডেটা লেখার কাস্টমাইজেশন | কাস্টমাইজেশন সম্ভব নয় | সম্পূর্ণ কাস্টমাইজেশন সম্ভব। |
| ব্যবহার | সাধারণ অবজেক্টের জন্য। | বিশেষ ক্ষেত্রে যেখানে ডেটা লেখা এবং পড়া কাস্টমাইজ করা প্রয়োজন। |
Externalizable ইন্টারফেস আপনাকে অবজেক্টের serialization এবং deserialization কাস্টমাইজ করতে দেয়, যা Serializable ইন্টারফেসের তুলনায় আরও নমনীয়। আপনি যখন চান যে আপনার অবজেক্টের ডেটা স্বাভাবিকভাবে না লিখে আপনার নিজের পছন্দমতো স্ট্রিমে লেখেন এবং পড়েন, তখন Externalizable ব্যবহৃত হয়। এটি Java Tuples ব্যবহার করে ডেটার প্রপার্টি সংরক্ষণ করার জন্যও উপকারী হতে পারে, যেখানে একাধিক অবজেক্টের state একটি Tuple হিসাবে রিট্রিভ করা যায়।
Read more