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 এর জন্য প্রয়োজনীয় মেথডসমূহ:
writeObject():- এটি serialization প্রক্রিয়ার সময় ব্যবহৃত হয়। এই মেথডে আপনি অবজেক্টটি কিভাবে serialize হবে তা কাস্টমাইজ করতে পারেন।
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 এর সুবিধা:
- Fine-grained Control:
- আপনি আপনার ক্লাসের অবজেক্টের serialization এবং deserialization প্রক্রিয়া কাস্টমাইজ করতে পারেন, যেমন কিছু ফিল্ড exclude বা modify করা।
- Sensitive Data Handling:
- আপনি নিরাপদ বা গোপন ডেটা, যেমন পাসওয়ার্ড,
transientদিয়ে বাদ দিতে পারেন এবং কাস্টমভাবে serialize/deserialize করতে পারেন।
- আপনি নিরাপদ বা গোপন ডেটা, যেমন পাসওয়ার্ড,
- Backward and Forward Compatibility:
- Custom serialization এর মাধ্যমে আপনি আগের ভার্সনের অবজেক্টে নতুন ফিল্ড যোগ করতে বা মুছে ফেলতে পারেন এবং version compatibility বজায় রাখতে সহায়ক।
- Improved Performance:
- আপনি যদি চান, কিছু ডেটা compression বা অন্য কোন বিশেষ পদ্ধতি দিয়ে serialize/deserialize করতে পারেন।
Custom Serialization এর সীমাবদ্ধতা:
- Complexity:
- Custom Serialization কিছুটা জটিল হতে পারে এবং অধিক কাস্টম লজিক ব্যবহারের ফলে কোড কঠিন হতে পারে।
- Increased Maintenance:
- কাস্টম serialization এবং deserialization কোড maintenance এর জন্য আরও সময়সাপেক্ষ হতে পারে, কারণ ফাইল/ডেটা স্ট্রাকচার পরিবর্তন হলে অতিরিক্ত পরিবর্তন করতে হতে পারে।
- Security Risks:
- নিরাপত্তার দিক থেকে যদি
readObject()এবংwriteObject()মেথডগুলিতে অতিরিক্ত কোড ব্যবহৃত হয়, তবে সেগুলি ভুলভাবে ব্যবহার হলে ডেটা নিরাপত্তা ঝুঁকি তৈরি হতে পারে।
- নিরাপত্তার দিক থেকে যদি
- Custom Serialization এর মাধ্যমে আপনি Java অবজেক্টের serialization এবং deserialization প্রক্রিয়াকে কাস্টমাইজ করতে পারেন।
- এটি
writeObject()এবংreadObject()মেথড ব্যবহার করে বিশেষভাবে ফিল্ড প্রক্রিয়া, সিকিউরিটি, বা ডেটা ভ্যালিডেশন বা পরিবর্তন করার সুবিধা প্রদান করে। - তবে, কাস্টম serialization এর ক্ষেত্রে কোডের জটিলতা এবং মেইনটেন্যান্সের দিকেও গুরুত্ব দিতে হবে।
Read more