Serialization এবং Externalizable Interface

জাভা আইও (Java.io Package) - Java Technologies

361

Serialization এবং Externalizable Interface হল Java I/O প্যাকেজের দুটি গুরুত্বপূর্ণ বিষয়, যা Java অবজেক্টের persistency এবং serialization এর জন্য ব্যবহৃত হয়। এগুলি অবজেক্টকে স্টোর এবং রিট্রিভ করার জন্য ব্যবহৃত হয়, যাতে আপনি অবজেক্টগুলিকে ফাইল, ডাটাবেস, নেটওয়ার্ক, বা অন্য কোনো সংরক্ষণ মাধ্যমে সহজে সংরক্ষণ এবং পুনরুদ্ধার করতে পারেন।


1. Serialization:

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

Serializable একটি marker interface (এটি কোন মেথড ডিফাইন করে না) যা Java ক্লাসে অ্যাড করা হয়, যাতে এটি জানানো হয় যে ক্লাসটি serializable অর্থাৎ এটি সেরিয়ালাইজ করা যাবে।

Serializable Interface:

  • Serializable ইন্টারফেস হল একটি marker interface, যার মাধ্যমে Java জানে যে এই ক্লাসের অবজেক্টকে serialization এবং deserialization করতে হবে।
  • এটি কোনো মেথড ডিফাইন করে না, এটি কেবল ক্লাসকে জানান দেয় যে তার অবজেক্টের ডেটা সেভ করা এবং পুনরুদ্ধার করা যাবে।

Serialization উদাহরণ:

import java.io.*;

class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

public class SerializationExample {
    public static void main(String[] args) {
        Person person = new Person("John", 25);
        
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            out.writeObject(person);  // অবজেক্টটি সেরিয়ালাইজ করা হচ্ছে
            System.out.println("Object serialized successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"))) {
            Person deserializedPerson = (Person) in.readObject();  // অবজেক্টটি ডেসিরিয়ালাইজ করা হচ্ছে
            System.out.println("Deserialized Object: " + deserializedPerson);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • Person ক্লাসে Serializable ইন্টারফেস ইমপ্লিমেন্ট করা হয়েছে।
  • প্রথমে ObjectOutputStream ব্যবহার করে অবজেক্টটি সেরিয়ালাইজ করা হচ্ছে এবং একটি ফাইলে সংরক্ষণ করা হচ্ছে।
  • পরে ObjectInputStream ব্যবহার করে সেরিয়ালাইজ করা অবজেক্টটি ডেসিরিয়ালাইজ করা হচ্ছে এবং পুনরায় একটি Person অবজেক্টে রূপান্তরিত করা হচ্ছে।

আউটপুট:

Object serialized successfully.
Deserialized Object: Person{name='John', age=25}

2. Externalizable Interface:

Externalizable ইন্টারফেস Serializable এর চেয়ে আরো বেশি কাস্টমাইজেশন প্রদান করে। এটি অবজেক্টকে সেরিয়ালাইজ করার সময় আপনার নিজের পছন্দমত কাস্টম সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন লজিক প্রয়োগ করতে সক্ষম করে। Externalizable ক্লাসের মধ্যে দুটি মেথড থাকে:

  1. writeExternal(ObjectOutput out): সেরিয়ালাইজেশন কাস্টমাইজ করার জন্য।
  2. readExternal(ObjectInput in): ডেসিরিয়ালাইজেশন কাস্টমাইজ করার জন্য।

যখন আপনি Externalizable ইন্টারফেস ইমপ্লিমেন্ট করেন, তখন আপনাকে অবশ্যই এই দুটি মেথড লিখতে হবে, যা সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন নিয়ন্ত্রণ করবে।

Externalizable Interface উদাহরণ:

import java.io.*;

class Person implements Externalizable {
    private String name;
    private int age;

    public Person() {
        // Default constructor for Externalizable
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);  // Write name
        out.writeInt(age);      // Write age
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name = (String) in.readObject();  // Read name
        age = in.readInt();               // Read age
    }

    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

public class ExternalizableExample {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);

        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person_external.ser"))) {
            out.writeObject(person);  // Serialize using Externalizable
            System.out.println("Object serialized using Externalizable.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("person_external.ser"))) {
            Person deserializedPerson = (Person) in.readObject();  // Deserialize using Externalizable
            System.out.println("Deserialized Object: " + deserializedPerson);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • Person ক্লাসটি Externalizable ইন্টারফেস ইমপ্লিমেন্ট করে এবং এর মধ্যে writeExternal() এবং readExternal() মেথড কাস্টম সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন জন্য ব্যবহৃত হচ্ছে।
  • এই উদাহরণে, ডেটা সেরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার জন্য কাস্টম লজিক তৈরি করা হয়েছে।

আউটপুট:

Object serialized using Externalizable.
Deserialized Object: Person{name='Alice', age=30}

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

ক্রাইটেরিয়াSerializableExternalizable
সিরিয়ালাইজেশন কাস্টমাইজেশনস্বয়ংক্রিয়ভাবে সমস্ত ফিল্ড সেরিয়ালাইজ করে।ডেভেলপারকে কাস্টম সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন পরিচালনা করতে দেয়।
ফিল্ড সেরিয়ালাইজেশনসমস্ত ফিল্ড সেরিয়ালাইজ হয়।শুধুমাত্র কাস্টমভাবে নির্ধারিত ফিল্ড সেরিয়ালাইজ হয়।
মেথডকোনো মেথড ইমপ্লিমেন্ট করার প্রয়োজন নেই।writeExternal() এবং readExternal() মেথড অবশ্যই ইমপ্লিমেন্ট করতে হয়।
এপ্লিকেশনসাধারণ ক্ষেত্রে ব্যবহার করা হয়।যেখানে কাস্টম সেরিয়ালাইজেশন বা ডেসিরিয়ালাইজেশন প্রয়োজন, সেখানে ব্যবহার করা হয়।

  1. Serialization:
    • Serializable একটি marker interface যা Java Object এর অবস্থা সংরক্ষণ বা পুনরুদ্ধারের জন্য ব্যবহৃত হয়।
    • এটি অবজেক্টকে একটি বাইনারি ফরম্যাটে রূপান্তরিত করে, যা ডেটা স্টোরেজ বা নেটওয়ার্কে পাঠানোর জন্য প্রয়োজন।
  2. Externalizable:
    • Externalizable ইন্টারফেস Serializable এর একটি উন্নত সংস্করণ যা ডেভেলপারকে সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কাস্টমাইজ করতে দেয়।
    • এটি writeExternal() এবং readExternal() মেথডের মাধ্যমে কাস্টম সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন সম্ভব করে।

এটি large-scale applications, distributed systems, এবং persistent storage এর জন্য অত্যন্ত গুরুত্বপূর্ণ, যেখানে অবজেক্টগুলো store করা এবং পরে retrieve করা প্রয়োজন।

Content added By

Java I/O প্যাকেজে Serialization এবং Externalizable দুটি খুব গুরুত্বপূর্ণ প্রযুক্তি যা object persistence এবং object transmission (অবজেক্টের স্থায়িত্ব এবং স্থানান্তর) এর জন্য ব্যবহৃত হয়। এটি সাধারণত Java objects কে byte streams-এ রূপান্তর করতে সহায়ক, যাতে এগুলিকে ফাইল সিস্টেমে সংরক্ষণ করা যায় বা নেটওয়ার্কের মাধ্যমে পাঠানো যায়।

Serialization:

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

Serialization এর কাজ:

  • Java দ্বারা automatic serialization প্রদান করা হয় যদি একটি ক্লাস Serializable ইন্টারফেস ইমপ্লিমেন্ট করে।
  • Serializable ইন্টারফেস ইমপ্লিমেন্ট করার মাধ্যমে, Java জানে যে এটি অবজেক্টের ডেটা ফাইল সিস্টেমে বা নেটওয়ার্কে সেভ করতে পারবে।

Serializable উদাহরণ:

import java.io.*;

class Person implements Serializable {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class SerializationExample {
    public static void main(String[] args) {
        Person person = new Person("John", 30);
        
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            out.writeObject(person); // অবজেক্টটি সিরিয়ালাইজ করা হচ্ছে
            System.out.println("Object Serialized");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • Person ক্লাসটি Serializable ইন্টারফেস ইমপ্লিমেন্ট করেছে।
  • ObjectOutputStream এর মাধ্যমে person অবজেক্টটি person.ser ফাইলে সেভ করা হয়েছে।
  • writeObject() মেথড ব্যবহার করে অবজেক্টটি serialization করা হচ্ছে।

Externalizable:

Externalizable ইন্টারফেসটি Serializable এর একটি উন্নত সংস্করণ, যেখানে আপনি serialization এবং deserialization এর পুরো নিয়ন্ত্রণ করতে পারেন। এটি আপনাকে অবজেক্টের serialization process কাস্টমাইজ করার সুযোগ দেয়।

Externalizable এর কাজ:

  • Externalizable ইন্টারফেসে দুটি মেথড থাকে:
    1. writeExternal(ObjectOutput out): এটি অবজেক্টের ডেটা লিখে।
    2. readExternal(ObjectInput in): এটি অবজেক্টের ডেটা পড়ে।
  • এখানে আপনি সুনির্দিষ্টভাবে কি ডেটা serialization করতে চান তা কাস্টমাইজ করতে পারেন।

Externalizable উদাহরণ:

import java.io.*;

class Person implements Externalizable {
    String name;
    int age;

    public Person() {
        // Default constructor needed for Externalizable
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);  // Only serialize name
        out.writeInt(age);      // Serialize age
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name = (String) in.readObject(); // Deserialize name
        age = in.readInt();              // Deserialize age
    }
}

public class ExternalizableExample {
    public static void main(String[] args) {
        Person person = new Person("John", 30);

        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("personExternal.ser"))) {
            out.writeObject(person); // Serialize object using Externalizable
            System.out.println("Object Serialized using Externalizable");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • Person ক্লাসটি Externalizable ইন্টারফেস ইমপ্লিমেন্ট করেছে।
  • writeExternal() এবং readExternal() মেথডগুলোর মাধ্যমে custom serialization এবং deserialization করা হচ্ছে।

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

বিষয়SerializationExternalizable
কন্ট্রোলJava স্বয়ংক্রিয়ভাবে অবজেক্টের serialization পরিচালনা করে।ব্যবহারকারী serialization এবং deserialization কাস্টমাইজ করতে পারেন।
ক্লাস ইমপ্লিমেন্টেশনSerializable ইন্টারফেস ইমপ্লিমেন্ট করতে হয়।Externalizable ইন্টারফেস ইমপ্লিমেন্ট করতে হয়।
কাস্টম Serializationকাস্টম serialization সম্ভব নয়।কাস্টম serialization সম্পূর্ণরূপে সম্ভব (writeExternal এবং readExternal মেথড ব্যবহার করে)।
ডিফল্ট কনস্ট্রাক্টরডিফল্ট কনস্ট্রাক্টর প্রয়োজন নেই।ডিফল্ট কনস্ট্রাক্টর প্রয়োজন (যেহেতু readExternal ব্যবহার করা হয়)।
সিরিয়ালাইজেশন প্রক্রিয়াJava অবজেক্টের সমস্ত ফিল্ড সিরিয়ালাইজ করে।আপনি কী কী ফিল্ড সিরিয়ালাইজ করবেন তা নির্ধারণ করতে পারেন।
Performanceসাধারণত Serializable দ্রুত এবং সহজ।কাস্টম serialization এর জন্য কিছু অতিরিক্ত কার্যপ্রণালী থাকতে পারে।
চালনাঅধিকাংশ ক্ষেত্রেই সহজ এবং সরল।বেশি কাস্টমাইজেশন ক্ষমতা এবং জটিল হতে পারে।

সারসংক্ষেপ:

  1. Serialization:
    • এটি একটি সহজ উপায় যা Java objects কে byte stream-এ রূপান্তর করতে দেয়। এটি Serializable ইন্টারফেস ব্যবহার করে কাজ করে এবং সাধারণভাবে অধিকাংশ ক্লাসে ব্যবহার করা হয়।
  2. Externalizable:
    • এটি Serializable এর একটি উন্নত সংস্করণ যা Externalizable ইন্টারফেস ব্যবহার করে। এখানে আপনি serialization এবং deserialization এর পুরো নিয়ন্ত্রণ করতে পারেন এবং কাস্টমাইজ করতে পারেন।
  3. পার্থক্য:
    • Serialization সাধারণত ফাস্ট এবং সহজ, তবে Externalizable অধিক কাস্টমাইজেশন প্রদান করে, তবে এটি কিছু বেশি জটিল হতে পারে।

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

Content added By

Externalizable একটি Java I/O ইন্টারফেস যা Serializable ইন্টারফেসের উন্নত সংস্করণ হিসেবে কাজ করে। যখন Serializable ইন্টারফেস ব্যবহার করে একটি অবজেক্টকে সেরিয়ালাইজ করা হয়, তখন জাভা স্বয়ংক্রিয়ভাবে ফিল্ডগুলির ডেটা সেরিয়ালাইজ করে। তবে, Externalizable ইন্টারফেস ব্যবহার করার মাধ্যমে আপনি কাস্টম সেরিয়ালাইজেশন কৌশল তৈরি করতে পারেন, যেখানে আপনি আপনার নির্দিষ্ট নিয়ম অনুসারে ডেটা লেখার এবং পড়ার প্রক্রিয়া নিয়ন্ত্রণ করতে পারবেন।

Externalizable Interface এর ভূমিকা:

Externalizable ইন্টারফেস দুটি মেথড writeExternal() এবং readExternal() ঘোষণা করে, যা ক্লাসটিকে কাস্টম সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করার অনুমতি দেয়। এটি আপনাকে সেরিয়ালাইজেশন প্রক্রিয়াকে সম্পূর্ণভাবে নিয়ন্ত্রণ করার সুযোগ দেয়, যেখানে আপনি কেবলমাত্র আপনার প্রয়োজনীয় ডেটা সেরিয়ালাইজ করতে পারেন এবং ডেসিরিয়ালাইজেশন প্রক্রিয়া থেকে নির্দিষ্ট ডেটা বাদ দিতে পারেন।

Externalizable Interface এর প্রধান মেথড:

  1. writeExternal(ObjectOutput out):
    • এই মেথডটি অবজেক্টের ডেটা সেরিয়ালাইজ করার জন্য ব্যবহার করা হয়। আপনাকে ObjectOutput স্ট্রীমের মাধ্যমে অবজেক্টের ডেটা লিখতে হবে।
  2. readExternal(ObjectInput in):
    • এই মেথডটি অবজেক্টের ডেটা ডেসিরিয়ালাইজ করার জন্য ব্যবহৃত হয়। এখানে আপনি ObjectInput স্ট্রীম থেকে ডেটা পড়তে পারেন এবং অবজেক্টের প্রোপার্টিগুলিতে সেট করতে পারেন।

Externalizable Interface এর সুবিধা:

  1. Customized Serialization:
    • Externalizable এর মাধ্যমে আপনি সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কৌশল কাস্টমাইজ করতে পারেন, যা আপনাকে শুধু প্রয়োজনীয় ডেটা সেরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে সহায়ক হয়।
  2. Control Over Data Serialization:
    • আপনি কোন ডেটা সেরিয়ালাইজ করবেন এবং কোনটি করবেন না তা সম্পূর্ণ নিয়ন্ত্রণ করতে পারবেন, যা Serializable ইন্টারফেসে করা সম্ভব নয়।
  3. Efficient Serialization:
    • যদি অবজেক্টের কিছু ডেটা কম্প্লেক্স বা বড় হয় এবং আপনি সেগুলি সেরিয়ালাইজ করতে চান না, তবে Externalizable ব্যবহারের মাধ্যমে আপনি সেগুলি বাদ দিতে পারেন।

Externalizable Interface এর ব্যবহার:

এখানে একটি উদাহরণ দেওয়া হল যেখানে Externalizable ইন্টারফেস ব্যবহার করে একটি অবজেক্টের ডেটা সেরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হবে।

Example: Using Externalizable Interface

import java.io.*;

class Person implements Externalizable {
    private String name;
    private int age;

    // Default constructor (required for Externalizable)
    public Person() {}

    // Constructor to initialize the person
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Custom serialization
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);  // Only serialize 'name'
        out.writeInt(age);       // Serialize 'age'
    }

    // Custom deserialization
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name = (String) in.readObject();  // Deserialize 'name'
        age = in.readInt();               // Deserialize 'age'
    }

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class ExternalizableExample {
    public static void main(String[] args) {
        // Create an object of Person
        Person person = new Person("John", 30);
        
        try {
            // Serialize the object
            FileOutputStream fileOut = new FileOutputStream("person.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            person.writeExternal(out);
            out.close();
            fileOut.close();

            // Deserialize the object
            FileInputStream fileIn = new FileInputStream("person.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            Person deserializedPerson = new Person();
            deserializedPerson.readExternal(in);
            in.close();
            fileIn.close();

            // Print the deserialized data
            System.out.println("Deserialized Person: ");
            System.out.println("Name: " + deserializedPerson.getName());
            System.out.println("Age: " + deserializedPerson.getAge());

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • Person ক্লাসটি Externalizable ইন্টারফেস ইমপ্লিমেন্ট করে এবং writeExternal() এবং readExternal() মেথডের মাধ্যমে সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কাস্টমাইজ করা হয়েছে।
  • writeExternal() মেথডে আমরা কেবল name এবং age প্রোপার্টি সেরিয়ালাইজ করছি।
  • readExternal() মেথডে আমরা সেগুলিকে পুনরায় ডেসিরিয়ালাইজ করছি।
  • Person অবজেক্টটি সেরিয়ালাইজ করা হচ্ছে এবং তারপর ডেসিরিয়ালাইজ করার পর name এবং age প্রোপার্টি প্রিন্ট করা হচ্ছে।

আউটপুট:

Deserialized Person:
Name: John
Age: 30

Externalizable Interface এর সুবিধা এবং সীমাবদ্ধতা:

সুবিধা:

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

সীমাবদ্ধতা:

  1. বিকল্প ডিফল্ট সেরিয়ালাইজেশন নেই:
    • Externalizable ইন্টারফেসের মাধ্যমে কাস্টম সেরিয়ালাইজেশন করতে হয়। এর মানে হচ্ছে, আপনাকে ম্যানুয়ালি সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কোড লিখতে হবে, যা Serializable ইন্টারফেসের তুলনায় বেশি কোডিং প্রয়োজন।
  2. কনস্ট্রাক্টর প্রয়োজন:
    • Externalizable ব্যবহার করার জন্য ক্লাসটির একটি no-argument constructor থাকা প্রয়োজন, যা কখনও কখনও ডেটা প্রক্রিয়া করতে অস্বাভাবিক হতে পারে।

  • Externalizable ইন্টারফেস Java I/O সিস্টেমে customized serialization এবং deserialization এর জন্য ব্যবহৃত হয়।
  • এটি Serializable এর তুলনায় আরও বেশি নিয়ন্ত্রণ প্রদান করে, বিশেষত যখন complex objects বা large datasets পরিচালনা করতে হয়।
  • Externalizable ইন্টারফেস ব্যবহার করে আপনি একটি অবজেক্টের ডেটা সেরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার প্রক্রিয়াকে কাস্টমাইজ করতে পারেন, যা পারফরম্যান্স এবং মেমরি ব্যবস্থাপনায় উন্নতি ঘটাতে সহায়ক।

Externalizable ইন্টারফেসটি advanced object serialization এর জন্য উপযুক্ত যেখানে সেরিয়ালাইজেশন প্রক্রিয়া বিস্তারিতভাবে নিয়ন্ত্রণ করতে হয়।

Content added By

Serialization হল একটি প্রক্রিয়া যেখানে Java অবজেক্টগুলোকে একটি বাইনারি ফর্ম্যাটে কনভার্ট করা হয়, যা ফাইল বা নেটওয়ার্কের মাধ্যমে ট্রান্সফার করা যায়। এর বিপরীত প্রক্রিয়া হল Deserialization, যেখানে সেই বাইনারি ডেটা আবার Java অবজেক্টে কনভার্ট করা হয়।

Java Serialization পদ্ধতিতে, Java এর Serializable ইন্টারফেস ব্যবহার করা হয়। যেকোনো ক্লাস যদি Serializable ইন্টারফেস ইমপ্লিমেন্ট করে, তবে তার অবজেক্টকে serialize বা deserialize করা যায়।

তবে অনেক সময় আমরা চাই না যে সমস্ত ফিল্ডকে serialize করা হোক বা আমরা চাই কিছু নির্দিষ্ট ফিল্ড কাস্টমভাবে serialize করা হোক। এমন ক্ষেত্রে Custom Serialization প্রয়োজন হয়।


Custom Serialization এর ধারণা:

Custom Serialization এর মাধ্যমে আমরা writeObject() এবং readObject() মেথড ব্যবহার করে serialization এবং deserialization প্রক্রিয়া কাস্টমাইজ করতে পারি। এই দুটি মেথডে আমাদের নিজস্ব লজিক প্রয়োগ করার সুযোগ থাকে, যেমন কিছু ফিল্ডকে exclude করা বা modified ডেটা দিয়ে serialize এবং deserialize করা।

Custom Serialization এর জন্য প্রয়োজনীয় মেথডসমূহ:

  1. writeObject():
    • এটি serialization প্রক্রিয়ার সময় ব্যবহৃত হয়। এই মেথডে আপনি অবজেক্টটি কিভাবে serialize হবে তা কাস্টমাইজ করতে পারেন।
  2. readObject():
    • এটি deserialization প্রক্রিয়ার সময় ব্যবহৃত হয়। এই মেথডে আপনি অবজেক্টটি কিভাবে deserialize হবে তা কাস্টমাইজ করতে পারেন।

Custom Serialization উদাহরণ:

Step 1: Serializable Interface Implement করা

প্রথমে, Serializable ইন্টারফেস ইমপ্লিমেন্ট করে একটি ক্লাস তৈরি করবো। এরপর writeObject() এবং readObject() মেথড ব্যবহার করে কাস্টম Serialization এবং Deserialization প্রক্রিয়া সেট করতে হবে।

import java.io.*;

class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private transient int age;  // `transient` ব্যবহারের মাধ্যমে এই ফিল্ডটি serialization থেকে বাদ যাবে
    private double salary;

    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }

    // Custom Serialization Method
    private void writeObject(ObjectOutputStream out) throws IOException {
        // Default serialization
        out.defaultWriteObject();
        
        // Age ফিল্ডকে custom ভাবে serialize করা (ভ্যালিডেশন বা মডিফিকেশন করতে পারি)
        out.writeInt(age + 10);  // উদাহরণস্বরূপ, age ফিল্ডে 10 যোগ করা হচ্ছে
    }

    // Custom Deserialization Method
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        // Default deserialization
        in.defaultReadObject();
        
        // Age ফিল্ডকে custom ভাবে deserialize করা
        this.age = in.readInt() - 10;  // আগের থেকে 10 কমানো হচ্ছে
    }
}

public class CustomSerializationExample {
    public static void main(String[] args) {
        Employee emp = new Employee("John Doe", 30, 50000.0);

        try {
            // Serialize the object to a file
            FileOutputStream fileOut = new FileOutputStream("employee.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(emp);
            out.close();
            fileOut.close();
            System.out.println("Employee object has been serialized.");

            // Deserialize the object from the file
            FileInputStream fileIn = new FileInputStream("employee.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            Employee deserializedEmp = (Employee) in.readObject();
            in.close();
            fileIn.close();

            System.out.println("Employee object has been deserialized.");
            System.out.println("Name: " + deserializedEmp.getName());
            System.out.println("Age: " + deserializedEmp.getAge());  // 10 কমে যাবে
            System.out.println("Salary: " + deserializedEmp.getSalary());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • Employee ক্লাসটি Serializable ইন্টারফেস ইমপ্লিমেন্ট করেছে এবং এতে name, age, এবং salary ফিল্ড রয়েছে।
  • transient কিওয়ার্ডটি ব্যবহার করে age ফিল্ডটি serialization থেকে বাদ দেওয়া হয়েছে। তাই এটি writeObject() এবং readObject() এর মাধ্যমে কাস্টমভাবে serialize এবং deserialize হবে।
  • writeObject() মেথডে age ফিল্ডে 10 যোগ করা হয়েছে যখন এটি serialize হয়, এবং readObject() মেথডে 10 কমিয়ে deserialize করা হচ্ছে।

Output:

Employee object has been serialized.
Employee object has been deserialized.
Name: John Doe
Age: 20
Salary: 50000.0

ব্যাখ্যা:

  • age ফিল্ডটি transient হওয়া সত্ত্বেও writeObject() এবং readObject() মেথড ব্যবহার করে কাস্টমভাবে serialize এবং deserialize করা হয়েছে, এবং এতে আমরা age এর মানে পরিবর্তন (10 যোগ/কম) করেছি।

Custom Serialization এর সুবিধা:

  1. Fine-grained Control:
    • আপনি আপনার ক্লাসের অবজেক্টের serialization এবং deserialization প্রক্রিয়া কাস্টমাইজ করতে পারেন, যেমন কিছু ফিল্ড exclude বা modify করা।
  2. Sensitive Data Handling:
    • আপনি নিরাপদ বা গোপন ডেটা, যেমন পাসওয়ার্ড, transient দিয়ে বাদ দিতে পারেন এবং কাস্টমভাবে serialize/deserialize করতে পারেন।
  3. Backward and Forward Compatibility:
    • Custom serialization এর মাধ্যমে আপনি আগের ভার্সনের অবজেক্টে নতুন ফিল্ড যোগ করতে বা মুছে ফেলতে পারেন এবং version compatibility বজায় রাখতে সহায়ক।
  4. Improved Performance:
    • আপনি যদি চান, কিছু ডেটা compression বা অন্য কোন বিশেষ পদ্ধতি দিয়ে serialize/deserialize করতে পারেন।

Custom Serialization এর সীমাবদ্ধতা:

  1. Complexity:
    • Custom Serialization কিছুটা জটিল হতে পারে এবং অধিক কাস্টম লজিক ব্যবহারের ফলে কোড কঠিন হতে পারে।
  2. Increased Maintenance:
    • কাস্টম serialization এবং deserialization কোড maintenance এর জন্য আরও সময়সাপেক্ষ হতে পারে, কারণ ফাইল/ডেটা স্ট্রাকচার পরিবর্তন হলে অতিরিক্ত পরিবর্তন করতে হতে পারে।
  3. Security Risks:
    • নিরাপত্তার দিক থেকে যদি readObject() এবং writeObject() মেথডগুলিতে অতিরিক্ত কোড ব্যবহৃত হয়, তবে সেগুলি ভুলভাবে ব্যবহার হলে ডেটা নিরাপত্তা ঝুঁকি তৈরি হতে পারে।

  • Custom Serialization এর মাধ্যমে আপনি Java অবজেক্টের serialization এবং deserialization প্রক্রিয়াকে কাস্টমাইজ করতে পারেন।
  • এটি writeObject() এবং readObject() মেথড ব্যবহার করে বিশেষভাবে ফিল্ড প্রক্রিয়া, সিকিউরিটি, বা ডেটা ভ্যালিডেশন বা পরিবর্তন করার সুবিধা প্রদান করে।
  • তবে, কাস্টম serialization এর ক্ষেত্রে কোডের জটিলতা এবং মেইনটেন্যান্সের দিকেও গুরুত্ব দিতে হবে।
Content added By

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 ইন্টারফেসের মেথড:

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

ব্যাখ্যা:

  1. Person ক্লাস:
    • Externalizable ইন্টারফেস ইমপ্লিমেন্ট করে এবং এর writeExternal() এবং readExternal() মেথড ব্যবহার করে কাস্টম serialization এবং deserialization প্রক্রিয়া কাস্টমাইজ করা হয়েছে।
    • writeExternal() মেথডে, অবজেক্টের name এবং age ফিল্ডগুলো output stream-এ লেখা হচ্ছে।
    • readExternal() মেথডে, সেই ফিল্ডগুলো input stream থেকে পড়ে অবজেক্টে ফিরিয়ে আনা হচ্ছে।
  2. Serialization:
    • অবজেক্টটি writeExternal() মেথডের মাধ্যমে person.ser ফাইলে সিরিয়ালাইজ হচ্ছে।
  3. Deserialization:
    • সিরিয়ালাইজড ফাইল থেকে readExternal() মেথড ব্যবহার করে অবজেক্টটি আবার পুনঃপ্রাপ্ত করা হচ্ছে এবং ডিসপ্লে করা হচ্ছে।

আউটপুট:

Serialization complete.
Deserialization complete.
Deserialized Person: Name: John, Age: 30

Externalizable এর সুবিধা:

  1. Custom Serialization:
    • আপনি writeExternal() এবং readExternal() মেথডের মাধ্যমে অবজেক্টের serialization এবং deserialization কাস্টমাইজ করতে পারেন। এটি আপনাকে আরও নিয়ন্ত্রণ দেয়, যেমন ডেটা ফিল্ডের ক্রম বা ফিল্ডের অংশ বাদ দেওয়া ইত্যাদি।
  2. Performance Optimization:
    • আপনি শুধু প্রয়োজনীয় ডেটা serialize করতে পারেন, যা Serializable ইন্টারফেসের তুলনায় আরও পারফর্ম্যান্স উন্নত হতে পারে।
  3. Versioning:
    • আপনি serialization এর জন্য ভার্সন কন্ট্রোল এবং কাস্টম লজিক যোগ করতে পারেন, যা ভবিষ্যতে অবজেক্টের ভার্সন পরিবর্তন হলে কাজ করতে সহায়ক।

Externalizable এর সীমাবদ্ধতা:

  1. Complexity:
    • Externalizable ব্যবহারে Serializable এর তুলনায় বেশি কোড লিখতে হয়, কারণ আপনি serialization এবং deserialization সম্পূর্ণভাবে কাস্টমাইজ করতে হবে।
  2. Requires Default Constructor:
    • Externalizable ইন্টারফেসটি ক্লাসে একটি default constructor দাবি করে, যা serialization এবং deserialization এর সময় ব্যবহৃত হয়।
  3. Manual Control:
    • Manual serialization এবং deserialization আপনাকে সঠিকভাবে কোড লেখা নিশ্চিত করতে সাহায্য করে, তবে এটি আপনার অ্যাপ্লিকেশনে ভুল হতে পারে যদি সঠিকভাবে না লেখা হয়।

  • Externalizable ইন্টারফেস Java serialization এর একটি উন্নত সংস্করণ যা আপনাকে অবজেক্টের serialization এবং deserialization কাস্টমাইজ করতে সক্ষম করে।
  • যখন আপনি custom serialization প্রক্রিয়া চান অথবা specific fields সেভ এবং লোড করতে চান, তখন Externalizable একটি উপকারী সমাধান।

এটি বড় এবং জটিল অবজেক্টের জন্য খুব কার্যকরী হতে পারে, যেখানে পারফরম্যান্স উন্নত করার জন্য serialization প্রক্রিয়াটি নিয়ন্ত্রণ করা প্রয়োজন।

Content added By
Promotion

Are you sure to start over?

Loading...