Tôi đang viết một ứng dụng Trò chuyện dựa trên RMI nhỏ.RMI NotSerializableException mặc dù đó là một đối tượng ở xa
Ý tưởng là: Khách hàng đăng ký chính mình trên Máy chủ và mỗi lần máy chủ nhận được thông báo từ khách hàng, anh ấy gửi thông báo này đến tất cả các khách hàng khác.
Nhưng tôi nhận được NotSerializableException mặc dù, đối tượng, tôi chuyển qua như một tham số phương thức triển khai giao diện Từ xa.
Dưới đây là một số mã: (Phần vấn đề là this
tham số trong this.chatServ.registriereClient(this);
(ClientChat thực hiện))
The (ClientChat) giao diện:
public interface ChatClient extends Remote
{
}
(ClientChat) Thực hiện:
public class ChatClientImpl implements ChatClient
{
ChatServer chatServ;
String clientName;
public ChatClientImpl(String clientName, ChatServer chatServ) {
this.chatServ = chatServ;
this.clientName = clientName;
try {
this.chatServ.registriereClient(this);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
(ServerChat) Giao diện
public interface ChatServer extends Remote
{
void registriereClient(ChatClient client) throws RemoteException;
}
(ServerChat) Thực hiện
public class LobbyChatServerImpl implements ChatServer
{
ArrayList<ChatClient> clientListe = null;
@Override
public void registriereClient(ChatClient client) {
System.out.println("Client registriert");
this.clientListe.add(client);
}
}
Chủ đầu tư:
public static void main(String[] args) {
ChatServer lobbyChatServer = null;
try {
Registry registry = LocateRegistry.getRegistry(Server.RMI_PORT);
lobbyChatServer = (ChatServer) registry.lookup("LobbyChatServer");
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
ChatClient lobbyChat = new ChatClientImpl(name, lobbyChatServer);
}
Server:
public static void main(String[] args) {
try {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
Registry registry = LocateRegistry.getRegistry(RMI_PORT);
ChatServer lobbyChatStub = (ChatServer)UnicastRemoteObject.exportObject(new LobbyChatServerImpl(), 0);
registry.bind("LobbyChatServer", lobbyChatStub);
} catch (RemoteException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
Ngoại lệ:
java.rmi.MarshalException: error marshalling arguments; nested exception is:
java.io.NotSerializableException: de.XX.Chat.ChatClientImpl
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:156)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at $Proxy0.registriereClient(Unknown Source)
at de.XX.Chat.ChatClientImpl.<init>(ChatClientImpl.java:19)
at de.XX.Client.main(Client.java:49)
Caused by: java.io.NotSerializableException: de.XX.Chat.ChatClientImpl
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:292)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:151)
... 5 more
Như đã nói, tôi tự hỏi tại sao tôi nhận được loại ngoại lệ này, mặc dù ChatClientImpl đã là Từ xa.
Hy vọng bạn có thể giúp tôi :)
cách sử dụng nó trong các lớp máy khách và máy chủ, riêng biệt? – Usman
@Usman Cách sử dụng cái gì? – EJP