我创建了一个简单的RMI应用程序:
public interface IAbsence extends Remote {
void inscrire(Etudiant e) throws RemoteException;
}
public class Absence extends UnicastRemoteObject implements IAbsence{
protected Absence() throws RemoteException {
super();
listEtudiants = new ArrayList<Etudiant>();
}
private static final long serialVersionUID = 1L;
private ArrayList<Etudiant> listEtudiants;
public void inscrire(Etudiant e) throws RemoteException {
listEtudiants.add(e);
}
}
对于服务器,我有以下内容:
public class Serveur {
public static void main(String[] args) throws RemoteException {
Absence absence = new Absence();
try {
Registry registry = LocateRegistry.createRegistry(52356);
registry.bind("Absence_RMI", absence);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("server ON");
}
}
对于客户我有这个:
public class ClientEtudiant {
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry("localhost",52356);
IAbsence absence_rmi = (IAbsence)registry.lookup("Absence_RMI");
///.... some code
absence_rmi.inscrire(new Etudiant(nom, prenom, cne));
System.out.println("L'étudiant a été inscrit");
} catch (RemoteException | NotBoundException e1) {
e1.printStackTrace();
}
}
}
当我运行服务器时,它运行没有问题,但是当我运行客户端时,我在行absence_rmi.inscrire...
上收到一条错误,上面写着:
java.rmi.MarshalException:错误编组参数;嵌套 异常是:java.io.NotSerializableException:Etudiant
答案 0 :(得分:0)
首先,如果您尝试发送自定义对象,则必须实施Interface Serializable 。
显然,从NotSerializableException Docs开始,如果您的类必须实现此接口,那么您将获得此异常,而您却没有。
其次,MarshallException在文档中有明确的解释可能的原因。确保您的RMI至少与原始类型一起使用。