Externalizable ইন্টারফেস হল java.io প্যাকেজের একটি ইন্টারফেস, যা Java Serialization API এর অংশ। এটি Serializable ইন্টারফেসের একটি বিকল্প। Externalizable ইন্টারফেস ব্যবহার করে একটি ক্লাস নিজে ডেটা কিভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করবে তা কাস্টমাইজ করা সম্ভব। এটি আপনাকে writeExternal() এবং readExternal() মেথড ব্যবহার করে সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কন্ট্রোল করার সুযোগ দেয়।
Externalizable ইন্টারফেসের ভূমিকা
- Customization of Serialization Process:
Externalizableইন্টারফেস ব্যবহার করে আপনি অবজেক্ট সিরিয়ালাইজ করার প্রক্রিয়া কাস্টমাইজ করতে পারেন। এতে আপনি অবজেক্টের ফিল্ডগুলি কিভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ হবে তা নিজের মতো নির্ধারণ করতে পারেন।
- Better Control:
Externalizableকেবলমাত্র দুটি মেথডwriteExternal()এবংreadExternal()প্রদান করে, যা সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশনের প্রক্রিয়া সম্পূর্ণ নিয়ন্ত্রণে রাখে। এর মাধ্যমে আপনি কোন ডেটা সংরক্ষণ করবেন এবং কিভাবে সংরক্ষণ করবেন তা নির্ধারণ করতে পারেন।
- Performance Consideration:
Externalizableইন্টারফেস ব্যবহার করলে আপনি অতিরিক্ত ডেটা সিরিয়ালাইজ করার থেকে বিরত থাকতে পারেন, যার ফলে পারফরম্যান্স বৃদ্ধি পায়। আপনি শুধুমাত্র প্রয়োজনীয় ডেটাই সিরিয়ালাইজ করতে পারেন।
Externalizable ইন্টারফেসের মেথড
writeExternal(ObjectOutput out):- এই মেথডে আপনি কাস্টম ডেটা সিরিয়ালাইজ করতে পারেন। আপনার ক্লাসের যে কোন ফিল্ড যা আপনি সিরিয়ালাইজ করতে চান, তা এখানে লিখবেন।
readExternal(ObjectInput in):- এই মেথডে আপনি ডেটা ডেসিরিয়ালাইজ করতে পারবেন। সিরিয়ালাইজড ফাইল থেকে ডেটা পুনরুদ্ধার করার সময় এই মেথড ব্যবহার হয়।
Externalizable Interface এর উদাহরণ
1. Externalizable ইন্টারফেস ব্যবহার করে কাস্টম সিরিয়ালাইজেশন
import java.io.*;
class Person implements Externalizable {
private String name;
private int age;
// Default constructor required for Externalizable
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Override writeExternal() method to control serialization
@Override
public void writeExternal(ObjectOutput out) throws IOException {
// Write fields explicitly
out.writeObject(name);
out.writeInt(age);
}
// Override readExternal() method to control deserialization
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// Read fields explicitly
name = (String) in.readObject();
age = in.readInt();
}
public void display() {
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
public class ExternalizableExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
try {
// Serialize the object
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
person.writeExternal(out); // Use writeExternal() to serialize the object
out.close();
fileOut.close();
System.out.println("Serialized data is saved in person.ser");
// Deserialize the object
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person deserializedPerson = new Person();
deserializedPerson.readExternal(in); // Use readExternal() to deserialize the object
in.close();
fileIn.close();
// Display deserialized data
deserializedPerson.display();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
writeExternal()মেথডেnameএবংageডেটা সিরিয়ালাইজ করা হয়েছে।readExternal()মেথডে সিরিয়ালাইজড ডেটা থেকেnameএবংageপুনরুদ্ধার করা হয়েছে।Externalizableইন্টারফেসে কাস্টম সিরিয়ালাইজেশন প্রক্রিয়া তৈরি করা হয়েছে, যেখানে শুধুমাত্র প্রয়োজনীয় ডেটা সিরিয়ালাইজ করা হয়েছে।
আউটপুট:
Serialized data is saved in person.ser
Name: Alice
Age: 30
Externalizable এবং Serializable এর মধ্যে পার্থক্য
| বিষয় | Serializable | Externalizable |
|---|---|---|
| Customization | কাস্টম সিরিয়ালাইজেশন করার কোন উপায় নেই। | কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করা যায়। |
| Methods | শুধু ডিফল্ট writeObject() এবং readObject() ব্যবহার হয়। | writeExternal() এবং readExternal() মেথড রয়েছে। |
| Performance | সব ফিল্ড সিরিয়ালাইজ করা হয়। | শুধুমাত্র প্রয়োজনীয় ডেটা সিরিয়ালাইজ করা যায়। |
| Complexity | সহজ, তবে কাস্টমাইজেশন সম্ভব নয়। | কাস্টমাইজেশন বেশি, তবে এর জন্য বেশি কোড এবং জটিলতা রয়েছে। |
| Serialization Control | জাভা নিজেই সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন নিয়ন্ত্রণ করে। | পুরো সিরিয়ালাইজেশন প্রক্রিয়া ক্লাস নিজেই নিয়ন্ত্রণ করে। |
Externalizable এর সুবিধা ও সীমাবদ্ধতা
সুবিধা:
- কাস্টম সিরিয়ালাইজেশন: আপনি ডেটা কিভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ হবে তা পুরোপুরি কাস্টমাইজ করতে পারবেন।
- পারফরম্যান্স: আপনি যেগুলি প্রয়োজনীয় বলে মনে করেন শুধুমাত্র সেই ডেটা সিরিয়ালাইজ করতে পারবেন, যা পারফরম্যান্স বাড়ায়।
- সিরিয়ালাইজেশন নিয়ন্ত্রণ: পুরো সিরিয়ালাইজেশন প্রক্রিয়ার উপর পূর্ণ নিয়ন্ত্রণ থাকে।
সীমাবদ্ধতা:
- কোড জটিলতা:
Serializableইন্টারফেসের তুলনায় কোড বেশি জটিল হয়ে যায়, কারণ আপনাকে সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন ম্যানুয়ালি করতে হয়। - অতিরিক্ত কোড:
writeExternal()এবংreadExternal()মেথড ব্যবহার করার জন্য অতিরিক্ত কোড লিখতে হয়। - অন্যান্য সমস্যাগুলি: কিছু ডেটা টাইপের জন্য ডিফল্ট সিরিয়ালাইজেশন প্রক্রিয়া
Externalizableএর তুলনায় সহজ হতে পারে।
Externalizable ইন্টারফেস আপনাকে Java Serialization প্রক্রিয়া কাস্টমাইজ করার অনুমতি দেয়। এটি Serializable ইন্টারফেসের তুলনায় আরো বেশি ক্ষমতাশালী, কারণ এতে আপনি সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কাস্টমাইজ করতে পারেন। তবে, এটি Serializable এর তুলনায় বেশি কোডের প্রয়োজন হয় এবং এটি ডেটার প্রক্রিয়া নিয়ন্ত্রণে বাড়তি জটিলতা সৃষ্টি করতে পারে। Externalizable ইন্টারফেসটি বেশি ব্যবহার হয় যখন সিরিয়ালাইজেশন প্রক্রিয়ার উপর পূর্ণ নিয়ন্ত্রণ প্রয়োজন হয় বা যখন পারফরম্যান্স উন্নত করতে কিছু ডেটা বাদ দেওয়া প্রয়োজন হয়।
Read more