RMI-তে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা পাঠানোর জন্য Object Serialization একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি একটি প্রক্রিয়া যার মাধ্যমে একটি অবজেক্টকে এমন ফরম্যাটে রূপান্তর করা হয় যা নেটওয়ার্কের মাধ্যমে স্থানান্তরযোগ্য এবং পরবর্তীতে পুনরায় ডি-সিরিয়ালাইজ করা যায়।
Object Serialization কী?
Serialization হলো একটি প্রক্রিয়া, যার মাধ্যমে Java অবজেক্টকে byte stream এ রূপান্তর করা হয়। এটি পরবর্তীতে ফাইল, ডেটাবেস, বা নেটওয়ার্কের মাধ্যমে স্থানান্তরের জন্য ব্যবহৃত হয়।
Deserialization হলো বিপরীত প্রক্রিয়া, যা byte stream থেকে অবজেক্ট পুনরুদ্ধার করে।
Serialization এর ব্যবহার:
- RMI-তে Remote Object Transfer।
- Persistent Data Storage (অবজেক্ট ফাইল বা ডেটাবেসে সংরক্ষণ)।
- Network Communication।
RMI-তে Object Transfer
RMI-তে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের সময়, Serializable অবজেক্টগুলো নেটওয়ার্কের মাধ্যমে পাঠানো হয়।
Key Concepts:
SerializableInterface:- যে কোনো অবজেক্টকে Serialization করতে হলে এটি
java.io.Serializableইন্টারফেস ইমপ্লিমেন্ট করতে হবে। - এই ইন্টারফেস কোনো মেথড ডিফাইন করে না (Marker Interface)।
- যে কোনো অবজেক্টকে Serialization করতে হলে এটি
- Object Passing Mechanisms:
- By Value: ক্লায়েন্ট ও সার্ভারের মধ্যে অবজেক্টের একটি কপি পাঠানো হয়।
- By Reference: Remote Object এর রেফারেন্স পাঠানো হয়, যা ক্লায়েন্ট রিমোটলি অ্যাক্সেস করতে পারে।
Serialization উদাহরণ
1. Serializable ক্লাস তৈরি করা
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L; // Unique ID for Serialization
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
// Getters and Setters
}
2. Remote Interface তৈরি করা
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface PersonService extends Remote {
String savePerson(Person person) throws RemoteException;
Person getPerson() throws RemoteException;
}
3. Remote Object Implementation
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class PersonServiceImpl extends UnicastRemoteObject implements PersonService {
private Person person;
protected PersonServiceImpl() throws RemoteException {
super();
}
@Override
public String savePerson(Person person) throws RemoteException {
this.person = person;
return "Person saved: " + person;
}
@Override
public Person getPerson() throws RemoteException {
return this.person;
}
}
4. Server Class
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server {
public static void main(String[] args) {
try {
PersonService personService = new PersonServiceImpl();
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind("PersonService", personService);
System.out.println("Server is running...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. Client Class
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
PersonService personService = (PersonService) registry.lookup("PersonService");
// Sending a serialized object
Person person = new Person("John Doe", 30);
String response = personService.savePerson(person);
System.out.println(response);
// Retrieving the object
Person retrievedPerson = personService.getPerson();
System.out.println("Retrieved Person: " + retrievedPerson);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Serialization-এর সুবিধা এবং সীমাবদ্ধতা
সুবিধা:
- Simple Object Transfer:
- অবজেক্টকে সহজেই নেটওয়ার্কে পাঠানো যায়।
- Cross-Network Compatibility:
- একবার অবজেক্ট সিরিয়ালাইজ করলে, এটি বিভিন্ন ডিভাইস বা প্ল্যাটফর্মে পাঠানো যায়।
- Persistent Storage:
- অবজেক্ট ফাইল বা ডেটাবেসে সংরক্ষণ করা যায়।
সীমাবদ্ধতা:
- Non-Serializable Fields:
transientবাstaticফিল্ডগুলো সিরিয়ালাইজ হয় না।
- Performance Overhead:
- সিরিয়ালাইজ এবং ডি-সিরিয়ালাইজ করতে বেশি সময় লাগে।
- Versioning Issue:
- ক্লাসের সংস্করণ পরিবর্তন করলে
InvalidClassExceptionহতে পারে যদিserialVersionUIDঠিকমতো সেট না থাকে।
- ক্লাসের সংস্করণ পরিবর্তন করলে
RMI-তে Serialization এবং Object Transfer এর গুরুত্বপূর্ণ বিষয়সমূহ
- Serializable Interface:
- যেসব ক্লাস RMI-তে স্থানান্তরিত হবে তাদের অবশ্যই Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হবে।
- Transient Keyword:
- কোন ফিল্ড যদি স্থানান্তর না করতে হয়, তবে সেটিকে
transientডিক্লেয়ার করতে হবে।
- কোন ফিল্ড যদি স্থানান্তর না করতে হয়, তবে সেটিকে
- serialVersionUID:
- সিরিয়ালাইজড অবজেক্টের সংস্করণ ট্র্যাক করার জন্য
serialVersionUIDব্যবহার করা হয়।
- সিরিয়ালাইজড অবজেক্টের সংস্করণ ট্র্যাক করার জন্য
Serialization ব্যবহার করে RMI Communication এর সারণি
| উদাহরণ | Serialization Type | ব্যাখ্যা |
|---|---|---|
| Remote Object | Reference | ক্লায়েন্ট Remote Object এর রেফারেন্স পায় এবং মেথড কল করে। |
| Custom Object | Value | অবজেক্টের কপি পাঠানো হয় এবং নেটওয়ার্কের মাধ্যমে স্থানান্তরিত হয়। |
RMI-তে Object Serialization এর মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে জটিল ডেটা সহজেই স্থানান্তর করা যায়। এটি জাভা ভিত্তিক ডিস্ট্রিবিউটেড সিস্টেম গঠনে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। Serialization ব্যবহারের সময় পারফরম্যান্স এবং নিরাপত্তা বিষয়েও সতর্ক থাকা জরুরি।
Read more