Serialization এবং Externalizable Interface

জাভা টাপল (Java Tuples) - Java Technologies

416

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 এর মধ্যে পার্থক্য

বিষয়SerializableExternalizable
Customizationকাস্টমাইজড serialization নয়কাস্টম serialization এবং deserialization সমর্থন করে
MethodwriteObject() এবং readObject() স্বয়ংক্রিয়ভাবে কাজ করেwriteExternal() এবং readExternal() ব্যবহার করতে হয়
Performanceকিছুটা ধীর হতে পারে কারণ জাভা স্বয়ংক্রিয়ভাবে ডেটা সেভ করেঅধিক কার্যকরী হতে পারে কারণ আপনি নিজে serialization প্রক্রিয়া নিয়ন্ত্রণ করতে পারেন
Flexibilityসীমিত কাস্টমাইজেশন, স্বয়ংক্রিয় প্রক্রিয়াপূর্ণ কাস্টমাইজেশন, ডেটার প্রক্রিয়া আপনার নিয়ন্ত্রণে

Serialization এবং Externalizable ইন্টারফেস জাভায় অবজেক্টের ডেটা সংরক্ষণ এবং নেটওয়ার্কে ট্রান্সফার করার জন্য গুরুত্বপূর্ণ। Serializable ইন্টারফেস সহজ এবং স্বয়ংক্রিয়ভাবে ডেটা সিরিয়ালাইজ করে, তবে Externalizable এর মাধ্যমে আপনি নিজে কাস্টমাইজড সেভ এবং লোড প্রক্রিয়া তৈরি করতে পারেন, যা কিছু ক্ষেত্রে আরও কার্যকরী হতে পারে। Java Tuples এর সাথে এই প্রক্রিয়াগুলি একত্রে ব্যবহার করে আপনি অবজেক্টের ডেটা আরও সংগঠিত এবং প্রক্রিয়া করতে সক্ষম হবেন।

Content added By

Serialization এবং Externalizable জাভায় অবজেক্টের স্টেট সংরক্ষণ এবং পুনরুদ্ধারের জন্য ব্যবহৃত দুটি গুরুত্বপূর্ণ মেকানিজম। তবে, তাদের মধ্যে কিছু মূল পার্থক্য রয়েছে, যা তাদের ব্যবহারের ক্ষেত্রে প্রভাব ফেলে। চলুন বিস্তারিতভাবে দেখা যাক।


Serialization:

Serialization হল একটি প্রক্রিয়া যার মাধ্যমে একটি অবজেক্টকে একটি স্ট্রিমে রূপান্তরিত করা হয়, যাতে সেই অবজেক্টটি ফাইল সিস্টেমে সংরক্ষণ বা নেটওয়ার্কের মাধ্যমে ট্রান্সফার করা যায়। Serializable ইন্টারফেসটি Javaserialization এর জন্য ব্যবহৃত হয়। অবজেক্টকে সিরিয়ালাইজ করার জন্য ক্লাসটিকে Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হয়।

Serialization এর প্রধান বৈশিষ্ট্য:

  1. Marker Interface: Serializable একটি marker interface, এর মধ্যে কোনো মেথড নেই। এটি শুধুমাত্র নির্দেশ দেয় যে অবজেক্টটি সিরিয়ালাইজ করা যাবে।
  2. Automatic Serialization: Serialization ক্লাসের মধ্যে সব প্রপার্টি এবং অবজেক্টগুলিকে স্বয়ংক্রিয়ভাবে স্ট্রিমে রূপান্তরিত করে। তবে, আপনার নিজস্ব writeObject() এবং readObject() মেথড ব্যবহার করতে পারেন কিছু কাস্টমাইজেশন এর জন্য।
  3. 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 এর প্রধান বৈশিষ্ট্য:

  1. Custom Serialization: Externalizable ইন্টারফেস দুটি মেথড প্রদান করে: writeExternal() এবং readExternal(), যা আপনাকে অবজেক্টের ডেটা কাস্টমাইজডভাবে লিখতে এবং পড়তে দেয়।
  2. Control over Serialization: Externalizable আপনি Serializable এর তুলনায় অধিক কাস্টমাইজেশন করতে পারবেন। আপনি নির্দিষ্টভাবে কী কী ডেটা স্টোর করতে চান তা নির্ধারণ করতে পারবেন।
  3. 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 এর মধ্যে পার্থক্য

দিকSerializationExternalizable
ইন্টারফেসSerializable (Marker interface)Externalizable (With writeExternal() and readExternal())
কাস্টমাইজেশনসীমিত কাস্টমাইজেশনপূর্ণ কাস্টমাইজেশন, আপনি ডেটা লিখতে এবং পড়তে পারেন
ফাংশনালিটিসব ডেটা স্বয়ংক্রিয়ভাবে সিরিয়ালাইজ হয়ডেটা সঠিকভাবে এবং কাস্টমাইজডভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হয়
পারফরম্যান্সসাধারণত ধীর হতে পারেঅধিক দ্রুত, কারণ আপনি ম্যানুয়ালি সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারেন
অবজেক্টের সংরক্ষণস্বয়ংক্রিয়ভাবে সমস্ত ফিল্ড সংরক্ষণ করা হয়আপনি নির্দিষ্টভাবে কোন ফিল্ড সংরক্ষণ করবেন তা নিয়ন্ত্রণ করতে পারেন
বিকল্পসহজ, তবে অনেক সময় অব্যবহৃত ডেটা সেভ হয়বেশি নিয়ন্ত্রণ এবং কাস্টমাইজেশন, তবে কিছু অতিরিক্ত কোডিং প্রয়োজন

কখন কোনটি ব্যবহার করবেন?

  1. Serialization:
    • যখন আপনি ডেটার পুরো অবস্থা (অথবা সব ফিল্ড) সংরক্ষণ করতে চান এবং ডেটার প্রক্রিয়াকরণ বা কাস্টমাইজেশনের জন্য অতিরিক্ত কোড লিখতে চান না।
  2. Externalizable:
    • যখন আপনি অবজেক্টের কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন পরিচালনা করতে চান এবং কিছু ফিল্ড বাদ দিতে চান, অথবা ফাইলের আকার ছোট রাখতে চান।

Serialization এবং Externalizable জাভাতে অবজেক্ট সংরক্ষণ এবং পুনরুদ্ধারের জন্য ব্যবহৃত দুটি প্রক্রিয়া। Serialization সাধারণভাবে সহজ এবং দ্রুত কার্যকর, কিন্তু সীমিত কাস্টমাইজেশন প্রদান করে। অন্যদিকে, Externalizable ব্যবহার করে আপনি অনেক বেশি নিয়ন্ত্রণ পেতে পারেন, তবে এটি আরও বেশি কোডিং এবং কাস্টমাইজেশন প্রয়োজন। আপনার অ্যাপ্লিকেশনের প্রয়োজন অনুসারে এই দুটি পদ্ধতির মধ্যে যে কোনো একটি নির্বাচন করতে হবে।

Content added By

Externalizable ইন্টারফেস হল java.io প্যাকেজের একটি ইন্টারফেস, যা Java Serialization API এর অংশ। এটি Serializable ইন্টারফেসের একটি বিকল্প। Externalizable ইন্টারফেস ব্যবহার করে একটি ক্লাস নিজে ডেটা কিভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করবে তা কাস্টমাইজ করা সম্ভব। এটি আপনাকে writeExternal() এবং readExternal() মেথড ব্যবহার করে সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কন্ট্রোল করার সুযোগ দেয়।

Externalizable ইন্টারফেসের ভূমিকা

  1. Customization of Serialization Process:
    • Externalizable ইন্টারফেস ব্যবহার করে আপনি অবজেক্ট সিরিয়ালাইজ করার প্রক্রিয়া কাস্টমাইজ করতে পারেন। এতে আপনি অবজেক্টের ফিল্ডগুলি কিভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ হবে তা নিজের মতো নির্ধারণ করতে পারেন।
  2. Better Control:
    • Externalizable কেবলমাত্র দুটি মেথড writeExternal() এবং readExternal() প্রদান করে, যা সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশনের প্রক্রিয়া সম্পূর্ণ নিয়ন্ত্রণে রাখে। এর মাধ্যমে আপনি কোন ডেটা সংরক্ষণ করবেন এবং কিভাবে সংরক্ষণ করবেন তা নির্ধারণ করতে পারেন।
  3. Performance Consideration:
    • Externalizable ইন্টারফেস ব্যবহার করলে আপনি অতিরিক্ত ডেটা সিরিয়ালাইজ করার থেকে বিরত থাকতে পারেন, যার ফলে পারফরম্যান্স বৃদ্ধি পায়। আপনি শুধুমাত্র প্রয়োজনীয় ডেটাই সিরিয়ালাইজ করতে পারেন।

Externalizable ইন্টারফেসের মেথড

  1. writeExternal(ObjectOutput out):
    • এই মেথডে আপনি কাস্টম ডেটা সিরিয়ালাইজ করতে পারেন। আপনার ক্লাসের যে কোন ফিল্ড যা আপনি সিরিয়ালাইজ করতে চান, তা এখানে লিখবেন।
  2. 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 এর মধ্যে পার্থক্য

বিষয়SerializableExternalizable
Customizationকাস্টম সিরিয়ালাইজেশন করার কোন উপায় নেই।কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করা যায়।
Methodsশুধু ডিফল্ট writeObject() এবং readObject() ব্যবহার হয়।writeExternal() এবং readExternal() মেথড রয়েছে।
Performanceসব ফিল্ড সিরিয়ালাইজ করা হয়।শুধুমাত্র প্রয়োজনীয় ডেটা সিরিয়ালাইজ করা যায়।
Complexityসহজ, তবে কাস্টমাইজেশন সম্ভব নয়।কাস্টমাইজেশন বেশি, তবে এর জন্য বেশি কোড এবং জটিলতা রয়েছে।
Serialization Controlজাভা নিজেই সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন নিয়ন্ত্রণ করে।পুরো সিরিয়ালাইজেশন প্রক্রিয়া ক্লাস নিজেই নিয়ন্ত্রণ করে।

Externalizable এর সুবিধা ও সীমাবদ্ধতা

সুবিধা:

  1. কাস্টম সিরিয়ালাইজেশন: আপনি ডেটা কিভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ হবে তা পুরোপুরি কাস্টমাইজ করতে পারবেন।
  2. পারফরম্যান্স: আপনি যেগুলি প্রয়োজনীয় বলে মনে করেন শুধুমাত্র সেই ডেটা সিরিয়ালাইজ করতে পারবেন, যা পারফরম্যান্স বাড়ায়।
  3. সিরিয়ালাইজেশন নিয়ন্ত্রণ: পুরো সিরিয়ালাইজেশন প্রক্রিয়ার উপর পূর্ণ নিয়ন্ত্রণ থাকে।

সীমাবদ্ধতা:

  1. কোড জটিলতা: Serializable ইন্টারফেসের তুলনায় কোড বেশি জটিল হয়ে যায়, কারণ আপনাকে সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন ম্যানুয়ালি করতে হয়।
  2. অতিরিক্ত কোড: writeExternal() এবং readExternal() মেথড ব্যবহার করার জন্য অতিরিক্ত কোড লিখতে হয়।
  3. অন্যান্য সমস্যাগুলি: কিছু ডেটা টাইপের জন্য ডিফল্ট সিরিয়ালাইজেশন প্রক্রিয়া Externalizable এর তুলনায় সহজ হতে পারে।

Externalizable ইন্টারফেস আপনাকে Java Serialization প্রক্রিয়া কাস্টমাইজ করার অনুমতি দেয়। এটি Serializable ইন্টারফেসের তুলনায় আরো বেশি ক্ষমতাশালী, কারণ এতে আপনি সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কাস্টমাইজ করতে পারেন। তবে, এটি Serializable এর তুলনায় বেশি কোডের প্রয়োজন হয় এবং এটি ডেটার প্রক্রিয়া নিয়ন্ত্রণে বাড়তি জটিলতা সৃষ্টি করতে পারে। Externalizable ইন্টারফেসটি বেশি ব্যবহার হয় যখন সিরিয়ালাইজেশন প্রক্রিয়ার উপর পূর্ণ নিয়ন্ত্রণ প্রয়োজন হয় বা যখন পারফরম্যান্স উন্নত করতে কিছু ডেটা বাদ দেওয়া প্রয়োজন হয়।

Content added By

Serialization হল একটি প্রক্রিয়া যার মাধ্যমে অবজেক্টকে একটি স্ট্রিমে রূপান্তরিত করা হয়, যাতে সেটি ফাইল সিস্টেমে সংরক্ষণ করা, অথবা নেটওয়ার্কের মাধ্যমে স্থানান্তর করা যায়। Java-তে সাধারণত Java Object Serialization ব্যবহার করে অবজেক্টগুলোকে বাইনারি ফরম্যাটে স্টোর বা ট্রান্সফার করা হয়।

যখন Custom Serialization প্রয়োগ করা হয়, তখন আমরা জাভার ডিফল্ট serialization mechanism পরিবর্তন করতে পারি। এর মাধ্যমে আমরা নির্দিষ্ট ভাবে কিভাবে অবজেক্টটি সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ হবে তা কাস্টমাইজ করতে পারি।


Custom Serialization কেন প্রয়োজন?

  1. বিশেষ ফিল্ড সিরিয়ালাইজ করা: কিছু ক্ষেত্রে অবজেক্টের কিছু ফিল্ড স্ট্যান্ডার্ড সিরিয়ালাইজেশনের মাধ্যমে সংরক্ষিত হওয়া উচিত নয়। আমরা Custom Serialization ব্যবহার করে নির্দিষ্ট ফিল্ডগুলো সিরিয়ালাইজ হতে রোধ করতে পারি।
  2. স্ট্রিমের আকার কমানো: কিছু ক্ষেত্রে, অবজেক্টের আকার বাড়ানোর পরিবর্তে কাস্টম ফরম্যাটে ডেটা সংরক্ষণ করা দরকার।
  3. কমপ্লেক্স অবজেক্ট লজিক: কোনো অবজেক্টের অবস্থা পুনরুদ্ধার করতে কাস্টম লজিক প্রয়োগ করা প্রয়োজন।

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:

  1. transient keyword:
    • transient শব্দটি ফিল্ডের আগে ব্যবহৃত হলে, সেই ফিল্ডটি serialization প্রক্রিয়া থেকে বাদ পড়ে। আমাদের উদাহরণে age ফিল্ডটি transient হওয়ায় এটি serialize হয়নি।
  2. writeObject() method:
    • writeObject() মেথডে, আমরা defaultWriteObject() কল করি যাতে সাধারণ অবজেক্ট ফিল্ডগুলি সিরিয়ালাইজ করা যায় এবং তারপরে আমরা age ফিল্ডটিকে কাস্টমভাবে সিরিয়ালাইজ করি (এটি transient হওয়ার কারণে ডিফল্টভাবে সিরিয়ালাইজ হবে না)।
  3. readObject() method:
    • readObject() মেথডে, আমরা defaultReadObject() কল করি, যাতে সাধারণ অবজেক্ট ফিল্ডগুলি deserialized হয় এবং তারপরে আমরা age ফিল্ডটিকে কাস্টমভাবে ডেসিরিয়ালাইজ করি।
  • Custom Serialization আপনাকে আপনার অবজেক্টের serialization এবং deserialization প্রক্রিয়াকে কাস্টমাইজ করার সুযোগ দেয়।
  • writeObject() এবং readObject() মেথডগুলি custom serialization এর জন্য ব্যবহৃত হয় এবং আপনি আপনার লজিক যোগ করতে পারেন, যেমন transient ফিল্ড সিরিয়ালাইজ না করা বা অন্যান্য কাস্টম ডেটা ফরম্যাট।
  • এটি বিশেষভাবে security, compression, অথবা specific data processing এর জন্য উপযুক্ত।

Java Tuples ব্যবহার করে আপনি serialized অবজেক্টের বিভিন্ন ফিল্ড সংরক্ষণ করতে পারেন এবং পরবর্তীতে tuple এর মাধ্যমে সেগুলি ব্যবহার করতে পারেন।

Content added By

Externalizable হল Java I/O-এর একটি ইন্টারফেস যা Serialization এবং Deserialization প্রক্রিয়ার জন্য ব্যবহৃত হয়। যখন একটি ক্লাস Externalizable ইন্টারফেস ইমপ্লিমেন্ট করে, তখন এটি ডেটা সংরক্ষণ (serialization) এবং পুনরুদ্ধার (deserialization) কাস্টমাইজ করতে পারে। Externalizable ইন্টারফেসে দুটি মেথড থাকে: writeExternal() এবং readExternal()

Externalizable ইন্টারফেসটি Serializable ইন্টারফেসের একটি উন্নত সংস্করণ। যেখানে Serializable সাধারণত Java দ্বারা পরিচালিত হয়, Externalizable ক্লাসগুলোর ক্ষেত্রে আপনি নিজে কাস্টম কনট্রোল রাখতে পারেন, অর্থাৎ আপনি কীভাবে একটি অবজেক্ট সিরিয়ালাইজ হবে তা নির্ধারণ করতে পারেন।


Externalizable ইন্টারফেসের দুটি মেথড:

  1. writeExternal(ObjectOutput out):
    • অবজেক্টের state স্ট্রীমে লেখার জন্য ব্যবহৃত হয়। এটি ObjectOutput টাইপের আর্গুমেন্ট গ্রহণ করে এবং অবজেক্টের ডেটা স্ট্রীমে লেখে।
  2. 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();
        }
    }
}

ব্যাখ্যা:

  1. writeExternal():
    • writeObject() ব্যবহার করে অবজেক্টের name প্রপার্টি এবং writeInt() ব্যবহার করে age প্রপার্টি স্ট্রিমে লেখার জন্য কাস্টমাইজ করা হয়েছে।
  2. readExternal():
    • readObject() ব্যবহার করে অবজেক্টের name এবং readInt() ব্যবহার করে age প্রপার্টি পুনরুদ্ধার করা হয়েছে।
  3. Serialization:
    • অবজেক্ট person প্রথমে সিরিয়ালাইজ হচ্ছে person.ser ফাইলে।
  4. Deserialization:
    • পরবর্তীতে সেই ফাইল থেকে অবজেক্টটি পুনরুদ্ধার করা হচ্ছে এবং কনসোলে আউটপুট প্রদর্শন করা হচ্ছে।

আউটপুট:

Original Person: Person{name='John Doe', age=30}
Person serialized successfully.
Deserialized Person: Person{name='John Doe', age=30}

Externalizable এবং Serializable এর মধ্যে পার্থক্য:

বিষয়SerializableExternalizable
স্বয়ংক্রিয় সিরিয়ালাইজেশনJava নিজে সিরিয়ালাইজেশন প্রক্রিয়া পরিচালনা করে।সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কাস্টমাইজ করা যায়।
বাধ্যতামূলক কনস্ট্রাক্টরনেইএকটি ডিফল্ট কনস্ট্রাক্টর থাকতে হবে।
ডেটা লেখার কাস্টমাইজেশনকাস্টমাইজেশন সম্ভব নয়সম্পূর্ণ কাস্টমাইজেশন সম্ভব।
ব্যবহারসাধারণ অবজেক্টের জন্য।বিশেষ ক্ষেত্রে যেখানে ডেটা লেখা এবং পড়া কাস্টমাইজ করা প্রয়োজন।

Externalizable ইন্টারফেস আপনাকে অবজেক্টের serialization এবং deserialization কাস্টমাইজ করতে দেয়, যা Serializable ইন্টারফেসের তুলনায় আরও নমনীয়। আপনি যখন চান যে আপনার অবজেক্টের ডেটা স্বাভাবিকভাবে না লিখে আপনার নিজের পছন্দমতো স্ট্রিমে লেখেন এবং পড়েন, তখন Externalizable ব্যবহৃত হয়। এটি Java Tuples ব্যবহার করে ডেটার প্রপার্টি সংরক্ষণ করার জন্যও উপকারী হতে পারে, যেখানে একাধিক অবজেক্টের state একটি Tuple হিসাবে রিট্রিভ করা যায়।

Content added By
Promotion

Are you sure to start over?

Loading...