Externalizable ইন্টারফেস Java I/O প্যাকেজের একটি অংশ, যা serialization এবং deserialization এর জন্য ব্যবহৃত হয়। Externalizable ইন্টারফেস Serializable ইন্টারফেসের একটি উন্নত সংস্করণ, যা আপনাকে অবজেক্টের serialization প্রক্রিয়া সম্পূর্ণভাবে কাস্টমাইজ করার অনুমতি দেয়।
Serializable ইন্টারফেস ব্যবহার করলে Java নিজেই অবজেক্টের serialization (অবজেক্টকে byte stream-এ রূপান্তরিত করা) এবং deserialization (byte stream থেকে অবজেক্টে রূপান্তরিত করা) পরিচালনা করে। কিন্তু Externalizable ইন্টারফেসে writeExternal() এবং readExternal() মেথডগুলির মাধ্যমে আপনি নিজেই serialization এবং deserialization প্রক্রিয়া নিয়ন্ত্রণ করতে পারেন।
এটি তখন ব্যবহার করা হয় যখন আপনার অবজেক্টের serialization প্রক্রিয়া সম্পূর্ণভাবে কাস্টমাইজ করতে হয় বা আপনি চান যে কিছু ফিল্ডের serialization প্রক্রিয়া নিয়ন্ত্রণ করতে পারবেন।
Externalizable ইন্টারফেসের মেথড:
writeExternal(ObjectOutput out):- এই মেথডটি অবজেক্টের ডেটা output stream-এ লেখার জন্য ব্যবহৃত হয়। আপনি এখানে কাস্টম serialization যুক্ত করতে পারেন।
readExternal(ObjectInput in):- এই মেথডটি অবজেক্টের ডেটা input stream থেকে পড়ে অবজেক্টে ফিরিয়ে আনে। আপনি এখানে কাস্টম deserialization যুক্ত করতে পারেন।
Externalizable ইন্টারফেসের ব্যবহার উদাহরণ:
উদাহরণ: Externalizable ইন্টারফেস ব্যবহার করে অবজেক্ট সিরিয়ালাইজেশন
এই উদাহরণে, আমরা একটি ক্লাস তৈরি করব যা Externalizable ইন্টারফেস ইমপ্লিমেন্ট করবে। এই ক্লাসে writeExternal() এবং readExternal() মেথডগুলির মাধ্যমে অবজেক্টের serialization এবং deserialization কাস্টমাইজ করা হবে।
import java.io.*;
class Person implements Externalizable {
private String name;
private int age;
// Default constructor (required for Externalizable)
public Person() {}
// Parametrized constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Implementing writeExternal method
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name); // serialize name
out.writeInt(age); // serialize age
}
// Implementing readExternal method
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = (String) in.readObject(); // deserialize name
age = in.readInt(); // deserialize age
}
// To display the object data
@Override
public String toString() {
return "Name: " + name + ", Age: " + age;
}
}
public class ExternalizableExample {
public static void main(String[] args) {
// Create a Person object
Person person = new Person("John", 30);
try {
// Serialize the person object
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
person.writeExternal(out); // Serialize using Externalizable method
out.close();
fileOut.close();
System.out.println("Serialization complete.");
// Deserialize the person object
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person deserializedPerson = new Person(); // Create new object
deserializedPerson.readExternal(in); // Deserialize using Externalizable method
in.close();
fileIn.close();
System.out.println("Deserialization complete.");
System.out.println("Deserialized Person: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
Personক্লাস:Externalizableইন্টারফেস ইমপ্লিমেন্ট করে এবং এরwriteExternal()এবংreadExternal()মেথড ব্যবহার করে কাস্টম serialization এবং deserialization প্রক্রিয়া কাস্টমাইজ করা হয়েছে।writeExternal()মেথডে, অবজেক্টেরnameএবংageফিল্ডগুলো output stream-এ লেখা হচ্ছে।readExternal()মেথডে, সেই ফিল্ডগুলো input stream থেকে পড়ে অবজেক্টে ফিরিয়ে আনা হচ্ছে।
- Serialization:
- অবজেক্টটি
writeExternal()মেথডের মাধ্যমে person.ser ফাইলে সিরিয়ালাইজ হচ্ছে।
- অবজেক্টটি
- Deserialization:
- সিরিয়ালাইজড ফাইল থেকে
readExternal()মেথড ব্যবহার করে অবজেক্টটি আবার পুনঃপ্রাপ্ত করা হচ্ছে এবং ডিসপ্লে করা হচ্ছে।
- সিরিয়ালাইজড ফাইল থেকে
আউটপুট:
Serialization complete.
Deserialization complete.
Deserialized Person: Name: John, Age: 30
Externalizable এর সুবিধা:
- Custom Serialization:
- আপনি
writeExternal()এবংreadExternal()মেথডের মাধ্যমে অবজেক্টের serialization এবং deserialization কাস্টমাইজ করতে পারেন। এটি আপনাকে আরও নিয়ন্ত্রণ দেয়, যেমন ডেটা ফিল্ডের ক্রম বা ফিল্ডের অংশ বাদ দেওয়া ইত্যাদি।
- আপনি
- Performance Optimization:
- আপনি শুধু প্রয়োজনীয় ডেটা serialize করতে পারেন, যা
Serializableইন্টারফেসের তুলনায় আরও পারফর্ম্যান্স উন্নত হতে পারে।
- আপনি শুধু প্রয়োজনীয় ডেটা serialize করতে পারেন, যা
- Versioning:
- আপনি serialization এর জন্য ভার্সন কন্ট্রোল এবং কাস্টম লজিক যোগ করতে পারেন, যা ভবিষ্যতে অবজেক্টের ভার্সন পরিবর্তন হলে কাজ করতে সহায়ক।
Externalizable এর সীমাবদ্ধতা:
- Complexity:
Externalizableব্যবহারেSerializableএর তুলনায় বেশি কোড লিখতে হয়, কারণ আপনি serialization এবং deserialization সম্পূর্ণভাবে কাস্টমাইজ করতে হবে।
- Requires Default Constructor:
- Externalizable ইন্টারফেসটি ক্লাসে একটি default constructor দাবি করে, যা serialization এবং deserialization এর সময় ব্যবহৃত হয়।
- Manual Control:
- Manual serialization এবং deserialization আপনাকে সঠিকভাবে কোড লেখা নিশ্চিত করতে সাহায্য করে, তবে এটি আপনার অ্যাপ্লিকেশনে ভুল হতে পারে যদি সঠিকভাবে না লেখা হয়।
- Externalizable ইন্টারফেস Java serialization এর একটি উন্নত সংস্করণ যা আপনাকে অবজেক্টের serialization এবং deserialization কাস্টমাইজ করতে সক্ষম করে।
- যখন আপনি custom serialization প্রক্রিয়া চান অথবা specific fields সেভ এবং লোড করতে চান, তখন Externalizable একটি উপকারী সমাধান।
এটি বড় এবং জটিল অবজেক্টের জন্য খুব কার্যকরী হতে পারে, যেখানে পারফরম্যান্স উন্নত করার জন্য serialization প্রক্রিয়াটি নিয়ন্ত্রণ করা প্রয়োজন।
Read more