Serialization এবং Externalizable ইন্টারফেস জাভার একটি গুরুত্বপূর্ণ ফিচার, যা অবজেক্টের স্টেট (অথবা ডেটা) সংরক্ষণ বা নেটওয়ার্কের মাধ্যমে ট্রান্সফার করতে ব্যবহৃত হয়। Serialization অবজেক্টের ডেটাকে একটি স্ট্রিমে রূপান্তরিত করে সেভ বা ট্রান্সফার করা সম্ভব করে, এবং Externalizable একটি কাস্টমাইজড পদ্ধতি দেয় যেখানে আপনি নিজেই ডেটা কিভাবে সিরিয়ালাইজ বা ডেসিরিয়ালাইজ করবেন তা নিয়ন্ত্রণ করতে পারেন।
Java Tuples ব্যবহার করে এই প্রক্রিয়া আরও সহজ হতে পারে, কারণ Tuples একাধিক মানকে একটি ডেটা স্ট্রাকচারে সংরক্ষণ এবং প্রসেস করতে সহায়ক।
Serialization
Serialization হল অবজেক্টের ডেটাকে একটি স্ট্রিমে রূপান্তরিত করার প্রক্রিয়া, যাতে সেই অবজেক্টটি সেভ বা ট্রান্সফার করা যায়। জাভাতে, একটি অবজেক্টকে serialize করার জন্য Serializable ইন্টারফেস ব্যবহার করা হয়।
Serializable ইন্টারফেস
Serializable একটি মার্কার ইন্টারফেস, যা একটি ক্লাসকে নির্দেশ করে যে, তার অবজেক্টগুলিকে সিরিয়ালাইজ করা যাবে। এটি কোন মেথড প্রয়োগ না করলেও কাজ করে, তবে ক্লাসটি Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হয়।
Serialization উদাহরণ
import java.io.*;
class Person implements 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 SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
// Serialize the object
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person);
System.out.println("Serialized data is saved in person.ser");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
Serializableইন্টারফেস ইমপ্লিমেন্ট করা Person ক্লাসের অবজেক্টObjectOutputStreamমাধ্যমে সিরিয়ালাইজ করা হয়েছে এবংperson.serফাইলে সেভ করা হয়েছে।
Deserialization উদাহরণ
Deserialization হল সিরিয়ালাইজ করা অবজেক্টকে আবার তার মূল অবজেক্টে রূপান্তরিত করার প্রক্রিয়া।
import java.io.*;
public class DeserializationExample {
public static void main(String[] args) {
Person person = null;
// Deserialize the object
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
person = (Person) in.readObject();
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 অবজেক্টের নাম এবং বয়স প্রিন্ট করা হয়েছে।
Externalizable Interface
Externalizable ইন্টারফেস Serializable এর থেকে আরও উন্নত। এটি অবজেক্ট সিরিয়ালাইজ করার জন্য নিজস্ব কাস্টমাইজড পদ্ধতি প্রদান করে। আপনি writeExternal() এবং readExternal() মেথড ব্যবহার করে অবজেক্টের ডেটা সেভ এবং রিট্রিভ করতে পারবেন। Externalizable ইন্টারফেস ব্যবহার করার সময়, অবজেক্টের writeObject() এবং readObject() মেথডকে কাস্টমাইজ করা যায়।
Externalizable ইন্টারফেসে দুটি প্রধান মেথড:
writeExternal(ObjectOutput out): অবজেক্টের ডেটা সিরিয়ালাইজ করার জন্য এই মেথডটি ব্যবহার করা হয়।readExternal(ObjectInput in): সিরিয়ালাইজ করা ডেটা অবজেক্টে পুনরুদ্ধার করার জন্য এই মেথডটি ব্যবহার করা হয়।
Externalizable উদাহরণ
import java.io.*;
class Person implements Externalizable {
private String name;
private int age;
// Default constructor
public Person() {}
// Constructor with parameters
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter methods
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Implementing writeExternal method
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name);
out.writeInt(age);
}
// Implementing readExternal method
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = (String) in.readObject();
age = in.readInt();
}
}
public class ExternalizableExample {
public static void main(String[] args) {
Person person = new Person("Bob", 35);
// Serialize the object using Externalizable
try (FileOutputStream fileOut = new FileOutputStream("person_external.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
person.writeExternal(out);
System.out.println("Serialized data using Externalizable is saved in person_external.ser");
} catch (IOException e) {
e.printStackTrace();
}
// Deserialize the object using Externalizable
try (FileInputStream fileIn = new FileInputStream("person_external.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Person personDeserialized = new Person();
personDeserialized.readExternal(in);
System.out.println("Deserialized Person:");
System.out.println("Name: " + personDeserialized.getName());
System.out.println("Age: " + personDeserialized.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
Personক্লাসExternalizableইন্টারফেস ইমপ্লিমেন্ট করেছে।writeExternal()এবংreadExternal()মেথডে অবজেক্টের ডেটা সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হয়েছে।person_external.serফাইলে ডেটা সিরিয়ালাইজ করা হয়েছে এবং পরে আবারExternalizableব্যবহার করে ডেসিরিয়ালাইজ করা হয়েছে।
Serializable এবং Externalizable এর মধ্যে পার্থক্য
| বিষয় | Serializable | Externalizable |
|---|---|---|
| Customization | কাস্টমাইজড serialization নয় | কাস্টম serialization এবং deserialization সমর্থন করে |
| Method | writeObject() এবং readObject() স্বয়ংক্রিয়ভাবে কাজ করে | writeExternal() এবং readExternal() ব্যবহার করতে হয় |
| Performance | কিছুটা ধীর হতে পারে কারণ জাভা স্বয়ংক্রিয়ভাবে ডেটা সেভ করে | অধিক কার্যকরী হতে পারে কারণ আপনি নিজে serialization প্রক্রিয়া নিয়ন্ত্রণ করতে পারেন |
| Flexibility | সীমিত কাস্টমাইজেশন, স্বয়ংক্রিয় প্রক্রিয়া | পূর্ণ কাস্টমাইজেশন, ডেটার প্রক্রিয়া আপনার নিয়ন্ত্রণে |
Serialization এবং Externalizable ইন্টারফেস জাভায় অবজেক্টের ডেটা সংরক্ষণ এবং নেটওয়ার্কে ট্রান্সফার করার জন্য গুরুত্বপূর্ণ। Serializable ইন্টারফেস সহজ এবং স্বয়ংক্রিয়ভাবে ডেটা সিরিয়ালাইজ করে, তবে Externalizable এর মাধ্যমে আপনি নিজে কাস্টমাইজড সেভ এবং লোড প্রক্রিয়া তৈরি করতে পারেন, যা কিছু ক্ষেত্রে আরও কার্যকরী হতে পারে। Java Tuples এর সাথে এই প্রক্রিয়াগুলি একত্রে ব্যবহার করে আপনি অবজেক্টের ডেটা আরও সংগঠিত এবং প্রক্রিয়া করতে সক্ষম হবেন।
Serialization এবং Externalizable জাভায় অবজেক্টের স্টেট সংরক্ষণ এবং পুনরুদ্ধারের জন্য ব্যবহৃত দুটি গুরুত্বপূর্ণ মেকানিজম। তবে, তাদের মধ্যে কিছু মূল পার্থক্য রয়েছে, যা তাদের ব্যবহারের ক্ষেত্রে প্রভাব ফেলে। চলুন বিস্তারিতভাবে দেখা যাক।
Serialization:
Serialization হল একটি প্রক্রিয়া যার মাধ্যমে একটি অবজেক্টকে একটি স্ট্রিমে রূপান্তরিত করা হয়, যাতে সেই অবজেক্টটি ফাইল সিস্টেমে সংরক্ষণ বা নেটওয়ার্কের মাধ্যমে ট্রান্সফার করা যায়। Serializable ইন্টারফেসটি Java এ serialization এর জন্য ব্যবহৃত হয়। অবজেক্টকে সিরিয়ালাইজ করার জন্য ক্লাসটিকে Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হয়।
Serialization এর প্রধান বৈশিষ্ট্য:
- Marker Interface:
Serializableএকটি marker interface, এর মধ্যে কোনো মেথড নেই। এটি শুধুমাত্র নির্দেশ দেয় যে অবজেক্টটি সিরিয়ালাইজ করা যাবে। - Automatic Serialization: Serialization ক্লাসের মধ্যে সব প্রপার্টি এবং অবজেক্টগুলিকে স্বয়ংক্রিয়ভাবে স্ট্রিমে রূপান্তরিত করে। তবে, আপনার নিজস্ব
writeObject()এবংreadObject()মেথড ব্যবহার করতে পারেন কিছু কাস্টমাইজেশন এর জন্য। - Performance: Serialization কিছুটা ধীর হতে পারে, কারণ এটি অবজেক্টের সমস্ত প্রপার্টি এবং অবজেক্ট সম্পর্কিত সব ডেটা সিরিয়ালাইজ করতে সময় নেয়।
Serialization উদাহরণ:
import java.io.*;
class Person implements Serializable {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
out.writeObject(person); // Serialize the object
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Serialization complete.");
}
}
ব্যাখ্যা:
Personক্লাসেSerializableইন্টারফেস ইমপ্লিমেন্ট করা হয়েছে, যার ফলে অবজেক্টটি সিরিয়ালাইজ করা যাবে।ObjectOutputStreamব্যবহার করে অবজেক্টটিperson.serফাইলে সিরিয়ালাইজ করা হয়েছে।
Externalizable:
Externalizable হল java.io প্যাকেজের একটি ইন্টারফেস যা Serializable এর চেয়েও বেশি কাস্টমাইজেশন দেয়। এটি অবজেক্টের serialization এবং deserialization এর প্রক্রিয়া সম্পূর্ণ নিয়ন্ত্রণ করে, যেখানে আপনি ম্যানুয়ালি কনটেন্ট লিখতে এবং পড়তে পারেন।
Externalizable এর প্রধান বৈশিষ্ট্য:
- Custom Serialization:
Externalizableইন্টারফেস দুটি মেথড প্রদান করে:writeExternal()এবংreadExternal(), যা আপনাকে অবজেক্টের ডেটা কাস্টমাইজডভাবে লিখতে এবং পড়তে দেয়। - Control over Serialization:
ExternalizableআপনিSerializableএর তুলনায় অধিক কাস্টমাইজেশন করতে পারবেন। আপনি নির্দিষ্টভাবে কী কী ডেটা স্টোর করতে চান তা নির্ধারণ করতে পারবেন। - Performance: Externalizable সাধারণত
Serializableথেকে দ্রুত হতে পারে, কারণ আপনি প্রয়োজনীয় তথ্যই সিরিয়ালাইজ করতে পারেন এবং অব্যবহৃত ডেটা বাদ দিতে পারেন।
Externalizable উদাহরণ:
import java.io.*;
class Person implements Externalizable {
String name;
int age;
Person() {
// Default constructor is required
}
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name); // Custom serialization
out.writeInt(age); // Custom serialization
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = (String) in.readObject(); // Custom deserialization
age = in.readInt(); // Custom deserialization
}
}
public class ExternalizableExample {
public static void main(String[] args) {
Person person = new Person("Bob", 25);
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person_ext.ser"))) {
out.writeObject(person); // Serialize the object using Externalizable
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Externalizable Serialization complete.");
}
}
ব্যাখ্যা:
Personক্লাসেExternalizableইন্টারফেস ইমপ্লিমেন্ট করা হয়েছে।writeExternal()এবংreadExternal()মেথডে ডেটা কাস্টমাইজডভাবে লেখার এবং পড়ার নিয়ন্ত্রণ প্রদান করা হয়েছে।
Serialization এবং Externalizable এর মধ্যে পার্থক্য
| দিক | Serialization | Externalizable |
|---|---|---|
| ইন্টারফেস | Serializable (Marker interface) | Externalizable (With writeExternal() and readExternal()) |
| কাস্টমাইজেশন | সীমিত কাস্টমাইজেশন | পূর্ণ কাস্টমাইজেশন, আপনি ডেটা লিখতে এবং পড়তে পারেন |
| ফাংশনালিটি | সব ডেটা স্বয়ংক্রিয়ভাবে সিরিয়ালাইজ হয় | ডেটা সঠিকভাবে এবং কাস্টমাইজডভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হয় |
| পারফরম্যান্স | সাধারণত ধীর হতে পারে | অধিক দ্রুত, কারণ আপনি ম্যানুয়ালি সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারেন |
| অবজেক্টের সংরক্ষণ | স্বয়ংক্রিয়ভাবে সমস্ত ফিল্ড সংরক্ষণ করা হয় | আপনি নির্দিষ্টভাবে কোন ফিল্ড সংরক্ষণ করবেন তা নিয়ন্ত্রণ করতে পারেন |
| বিকল্প | সহজ, তবে অনেক সময় অব্যবহৃত ডেটা সেভ হয় | বেশি নিয়ন্ত্রণ এবং কাস্টমাইজেশন, তবে কিছু অতিরিক্ত কোডিং প্রয়োজন |
কখন কোনটি ব্যবহার করবেন?
- Serialization:
- যখন আপনি ডেটার পুরো অবস্থা (অথবা সব ফিল্ড) সংরক্ষণ করতে চান এবং ডেটার প্রক্রিয়াকরণ বা কাস্টমাইজেশনের জন্য অতিরিক্ত কোড লিখতে চান না।
- Externalizable:
- যখন আপনি অবজেক্টের কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন পরিচালনা করতে চান এবং কিছু ফিল্ড বাদ দিতে চান, অথবা ফাইলের আকার ছোট রাখতে চান।
Serialization এবং Externalizable জাভাতে অবজেক্ট সংরক্ষণ এবং পুনরুদ্ধারের জন্য ব্যবহৃত দুটি প্রক্রিয়া। Serialization সাধারণভাবে সহজ এবং দ্রুত কার্যকর, কিন্তু সীমিত কাস্টমাইজেশন প্রদান করে। অন্যদিকে, Externalizable ব্যবহার করে আপনি অনেক বেশি নিয়ন্ত্রণ পেতে পারেন, তবে এটি আরও বেশি কোডিং এবং কাস্টমাইজেশন প্রয়োজন। আপনার অ্যাপ্লিকেশনের প্রয়োজন অনুসারে এই দুটি পদ্ধতির মধ্যে যে কোনো একটি নির্বাচন করতে হবে।
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 ইন্টারফেসটি বেশি ব্যবহার হয় যখন সিরিয়ালাইজেশন প্রক্রিয়ার উপর পূর্ণ নিয়ন্ত্রণ প্রয়োজন হয় বা যখন পারফরম্যান্স উন্নত করতে কিছু ডেটা বাদ দেওয়া প্রয়োজন হয়।
Serialization হল একটি প্রক্রিয়া যার মাধ্যমে অবজেক্টকে একটি স্ট্রিমে রূপান্তরিত করা হয়, যাতে সেটি ফাইল সিস্টেমে সংরক্ষণ করা, অথবা নেটওয়ার্কের মাধ্যমে স্থানান্তর করা যায়। Java-তে সাধারণত Java Object Serialization ব্যবহার করে অবজেক্টগুলোকে বাইনারি ফরম্যাটে স্টোর বা ট্রান্সফার করা হয়।
যখন Custom Serialization প্রয়োগ করা হয়, তখন আমরা জাভার ডিফল্ট serialization mechanism পরিবর্তন করতে পারি। এর মাধ্যমে আমরা নির্দিষ্ট ভাবে কিভাবে অবজেক্টটি সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ হবে তা কাস্টমাইজ করতে পারি।
Custom Serialization কেন প্রয়োজন?
- বিশেষ ফিল্ড সিরিয়ালাইজ করা: কিছু ক্ষেত্রে অবজেক্টের কিছু ফিল্ড স্ট্যান্ডার্ড সিরিয়ালাইজেশনের মাধ্যমে সংরক্ষিত হওয়া উচিত নয়। আমরা Custom Serialization ব্যবহার করে নির্দিষ্ট ফিল্ডগুলো সিরিয়ালাইজ হতে রোধ করতে পারি।
- স্ট্রিমের আকার কমানো: কিছু ক্ষেত্রে, অবজেক্টের আকার বাড়ানোর পরিবর্তে কাস্টম ফরম্যাটে ডেটা সংরক্ষণ করা দরকার।
- কমপ্লেক্স অবজেক্ট লজিক: কোনো অবজেক্টের অবস্থা পুনরুদ্ধার করতে কাস্টম লজিক প্রয়োগ করা প্রয়োজন।
Custom Serialization Implement করার কৌশল
Java-তে Custom Serialization করতে হলে আপনাকে readObject() এবং writeObject() মেথডগুলোকে কাস্টমাইজ করতে হবে। এগুলি Serializable ইন্টারফেসের অংশ নয়, তবে আপনি এই মেথডগুলো নিজের ক্লাসে লিখে Serialization এবং Deserialization কাস্টমাইজ করতে পারবেন।
Custom Serialization এর উদাহরণ
Step 1: Serializable Interface Implement করা
আপনার ক্লাসে Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হবে যাতে জাভা জানে যে এই ক্লাসটি সিরিয়ালাইজযোগ্য।
Step 2: writeObject() এবং readObject() মেথড কাস্টমাইজ করা
এই মেথডগুলো আপনার কাস্টম সিরিয়ালাইজেশন লজিক বাস্তবায়ন করতে ব্যবহার করা হবে।
Custom Serialization উদাহরণ
কোড উদাহরণ:
import java.io.*;
import java.util.Date;
public class Employee implements Serializable {
private String name;
private transient int age; // Transient, means it won't be serialized
private Date birthDate;
public Employee(String name, int age, Date birthDate) {
this.name = name;
this.age = age;
this.birthDate = birthDate;
}
// Custom serialization
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject(); // default serialization of non-transient fields
// custom logic to serialize the 'age' field
oos.writeInt(age);
}
// Custom deserialization
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject(); // default deserialization of non-transient fields
// custom logic to deserialize the 'age' field
age = ois.readInt();
}
// Getter and Setter methods
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Date getBirthDate() {
return birthDate;
}
@Override
public String toString() {
return "Employee{name='" + name + "', age=" + age + ", birthDate=" + birthDate + '}';
}
public static void main(String[] args) {
Employee emp = new Employee("John", 30, new Date());
// Serializing the object to a file
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("employee.ser"))) {
oos.writeObject(emp);
System.out.println("Employee object serialized successfully.");
} catch (IOException e) {
e.printStackTrace();
}
// Deserializing the object from the file
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("employee.ser"))) {
Employee deserializedEmp = (Employee) ois.readObject();
System.out.println("Deserialized Employee: " + deserializedEmp);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Explanation:
transientkeyword:transientশব্দটি ফিল্ডের আগে ব্যবহৃত হলে, সেই ফিল্ডটি serialization প্রক্রিয়া থেকে বাদ পড়ে। আমাদের উদাহরণেageফিল্ডটিtransientহওয়ায় এটি serialize হয়নি।
writeObject()method:writeObject()মেথডে, আমরাdefaultWriteObject()কল করি যাতে সাধারণ অবজেক্ট ফিল্ডগুলি সিরিয়ালাইজ করা যায় এবং তারপরে আমরাageফিল্ডটিকে কাস্টমভাবে সিরিয়ালাইজ করি (এটিtransientহওয়ার কারণে ডিফল্টভাবে সিরিয়ালাইজ হবে না)।
readObject()method:readObject()মেথডে, আমরাdefaultReadObject()কল করি, যাতে সাধারণ অবজেক্ট ফিল্ডগুলি deserialized হয় এবং তারপরে আমরাageফিল্ডটিকে কাস্টমভাবে ডেসিরিয়ালাইজ করি।
- Custom Serialization আপনাকে আপনার অবজেক্টের serialization এবং deserialization প্রক্রিয়াকে কাস্টমাইজ করার সুযোগ দেয়।
writeObject()এবংreadObject()মেথডগুলি custom serialization এর জন্য ব্যবহৃত হয় এবং আপনি আপনার লজিক যোগ করতে পারেন, যেমনtransientফিল্ড সিরিয়ালাইজ না করা বা অন্যান্য কাস্টম ডেটা ফরম্যাট।- এটি বিশেষভাবে security, compression, অথবা specific data processing এর জন্য উপযুক্ত।
Java Tuples ব্যবহার করে আপনি serialized অবজেক্টের বিভিন্ন ফিল্ড সংরক্ষণ করতে পারেন এবং পরবর্তীতে tuple এর মাধ্যমে সেগুলি ব্যবহার করতে পারেন।
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