Java RMI (Remote Method Invocation) এমন একটি প্রযুক্তি যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন তৈরি করার জন্য ব্যবহৃত হয়। এই প্রক্রিয়ায় Object Serialization একটি গুরুত্বপূর্ণ ভূমিকা পালন করে, কারণ এটি ডেটা বা অবজেক্টকে এমন ফরম্যাটে রূপান্তরিত করে যা নেটওয়ার্কে প্রেরণ করা যায়।
Object Serialization এর ধারণা
Object Serialization হলো এমন একটি প্রক্রিয়া যেখানে জাভার অবজেক্টগুলিকে byte stream-এ রূপান্তরিত করা হয়, যাতে এটি ফাইল, ডেটাবেস, বা নেটওয়ার্কের মাধ্যমে প্রেরণ করা যায় এবং পরে সেই ডেটা পুনরায় অবজেক্টে রূপান্তরিত করা যায়।
মূল পয়েন্টসমূহ:
- Serialization:
- অবজেক্টকে byte stream-এ রূপান্তরিত করা।
- Deserialization:
- byte stream থেকে পুনরায় অবজেক্ট তৈরি করা।
- Implemented Interface:
- অবজেক্টকে Serializable করতে হলে সেই ক্লাসকে
java.io.Serializableইন্টারফেসটি ইমপ্লিমেন্ট করতে হবে।
- অবজেক্টকে Serializable করতে হলে সেই ক্লাসকে
Serialization কিভাবে কাজ করে?
- Serialization API:
ObjectOutputStreamএর মাধ্যমে অবজেক্ট Serialize করা হয়।ObjectInputStreamএর মাধ্যমে অবজেক্ট Deserialize করা হয়।
Serialization উদাহরণ:
import java.io.*;
// Serializable ক্লাস
class Person implements Serializable {
private static final long serialVersionUID = 1L;
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 + '}';
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("John Doe", 30);
// Serialization
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("Object serialized: " + person);
} catch (IOException e) {
e.printStackTrace();
}
// Deserialization
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("Object deserialized: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Object Serialization এর প্রয়োজনীয়তা RMI-তে
RMI প্রযুক্তি ক্লায়েন্ট এবং সার্ভারের মধ্যে Remote Method Invocation-এর সময় অবজেক্ট পাস করতে Serialization ব্যবহার করে।
কেন প্রয়োজন?
- নেটওয়ার্কে অবজেক্ট প্রেরণ:
- RMI তে রিমোট মেথড কল করার সময়, প্যারামিটার এবং রিটার্ন ভ্যালুগুলোকে নেটওয়ার্কের মাধ্যমে প্রেরণ করতে হয়। এজন্য Serialization আবশ্যক।
- অবজেক্ট স্টেট সংরক্ষণ:
- একটি অবজেক্টের স্টেটকে নেটওয়ার্কের মাধ্যমে প্রেরণ বা ডিস্কে সংরক্ষণ করতে হলে Serialization প্রয়োজন।
- Distributed Environment:
- ডিস্ট্রিবিউটেড সিস্টেমে, অবজেক্টকে এক মেশিন থেকে আরেক মেশিনে স্থানান্তরিত করার জন্য Serialization অত্যন্ত গুরুত্বপূর্ণ।
RMI-তে Object Serialization এর কাজের ধাপ
- Serialize অবজেক্ট:
- যখন ক্লায়েন্ট কোনো রিমোট মেথড কল করে এবং প্যারামিটার পাস করে, RMI Framework সেই প্যারামিটার Serialize করে।
- Transfer Serialized Data:
- Serialized ডেটা নেটওয়ার্কের মাধ্যমে RMI Registry বা সার্ভারে পাঠানো হয়।
- Deserialize অবজেক্ট:
- সার্ভার সাইডে ডেটা Deserialize হয় এবং পুনরায় অবজেক্টে রূপান্তরিত হয়।
- Remote Method Result Serialize:
- সার্ভার সাইডে মেথড এক্সিকিউশনের পর রিটার্ন ভ্যালু Serialize হয়ে ক্লায়েন্টের কাছে পাঠানো হয়।
RMI-তে Serialization উদাহরণ
Remote Interface:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface UserService extends Remote {
User getUserDetails() throws RemoteException;
}
Serializable Class:
import java.io.Serializable;
// User ক্লাস Serializable
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private int age;
public User(String username, int age) {
this.username = username;
this.age = age;
}
@Override
public String toString() {
return "User{username='" + username + "', age=" + age + '}';
}
}
Remote Implementation:
import java.rmi.server.UnicastRemoteObject;
public class UserServiceImpl extends UnicastRemoteObject implements UserService {
protected UserServiceImpl() throws RemoteException {
super();
}
@Override
public User getUserDetails() throws RemoteException {
return new User("Alice", 25);
}
}
Server:
import java.rmi.Naming;
public class UserServer {
public static void main(String[] args) {
try {
UserService userService = new UserServiceImpl();
Naming.rebind("rmi://localhost:1099/UserService", userService);
System.out.println("User Service is running...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client:
import java.rmi.Naming;
public class UserClient {
public static void main(String[] args) {
try {
UserService userService = (UserService) Naming.lookup("rmi://localhost:1099/UserService");
User user = userService.getUserDetails();
System.out.println("Received User Details: " + user);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Serialization এর সীমাবদ্ধতা
- Non-Serializable Objects:
- যদি কোনো ক্লাস Serializable ইন্টারফেস ইমপ্লিমেন্ট না করে, তবে তা Serialize করা যায় না।
- Static এবং Transient ফিল্ড:
- Static এবং Transient ফিল্ডগুলো Serialize হয় না।
- Versioning Issue:
- সিরিয়ালাইজড অবজেক্টের জন্য serialVersionUID ভার্সনিং ব্যবস্থার সঠিক ব্যবস্থাপনা দরকার।
Object Serialization জাভা RMI-তে একটি অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি ডেটা বা অবজেক্টকে নেটওয়ার্কের মাধ্যমে স্থানান্তরের জন্য রূপান্তরিত করে এবং পুনরায় গঠন করতে সহায়তা করে। Serialization ছাড়া RMI ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা প্রেরণ কার্যকরভাবে সম্ভব নয়।
Read more