我正在使用RMI以文本模式构建此客户端/服务器应用程序。 在这个应用程序中,我需要使用两个ArrayLists,然后将它们保存到服务器端的两个文件。
事实上,我必须在远程方法中操作这些ArrayLists(不要将它们作为参数传递),因此,我必须声明它们并在类中将它们实例化为全局变量。
问题是,当我在 main()中准备代码时,最初将文件中的对象加载到ArrayLists,然后,在服务器终止之前,将ArrayLists保存到文件,,,我被迫将ArrayLists声明为 static ,因为我在 main()中使用它们,这是一个静态环境(public static void main( String [] args))!所以序列化不会起作用,因为它们是静态的!
这是来自服务器端的一段代码,其中我有全局变量,构造函数和两个方法作为示例:
public class Server extends java.rmi.server.UnicastRemoteObject implements ServerInterface{
private static ArrayList<UC> cadeiras = new ArrayList<UC>();
private static ArrayList<Utilizador> utilizadores = new ArrayList<Utilizador>();
private static ClientInterface client;
private static int numAcessos = 0;
private Exercicio exercicio;
protected Server(int port) throws RemoteException{
super(port, new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory(null, null, true));
}
public boolean verificaUtilizador(String login, String password) throws RemoteException{
for(int i = 0; i < utilizadores.size(); i++)
if(utilizadores.get(i).getNome().equals(login))
if(utilizadores.get(i).getSenha().equals(password)){
numAcessos++;
return true;
}
return false;
}
public boolean verificaCodigoUC(int codigo)throws RemoteException{
for(int i = 0; i < cadeiras.size(); i++)
if(cadeiras.get(i).getCodigo() == codigo)
return true;
return false;
}
现在来自 main()的部分,我将ArrayLists加载/保存到文件中:
public static void main(String[] args){
File ficheiroUCs = new File("cadeiras.dat");
File ficheiroUsers = new File("utilizadores.dat");
try{
FileInputStream isUCs = new FileInputStream(ficheiroUCs);
ObjectInputStream oISUCs = new ObjectInputStream(isUCs);
FileInputStream isUsers = new FileInputStream(ficheiroUsers);
ObjectInputStream oISUsers = new ObjectInputStream(isUsers);
cadeiras = (ArrayList<UC>)oISUCs.readObject();
utilizadores = (ArrayList<Utilizador>)oISUsers.readObject();
oISUCs.close();
oISUsers.close();
isUCs.close();
isUsers.close();
} catch( IOException e){
System.out.println(e.getMessage());
} catch (ClassNotFoundException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
System.setSecurityManager(new SecurityManager());
try{
setSettings();
Registry registry = LocateRegistry.createRegistry(1099, new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory(null, null, true));
System.out.println("RMI registry ready.");
Server servidor = new Server(1099);
registry.bind("//" + InetAddress.getLocalHost().getHostAddress() + "/Portal", servidor);
System.out.println("Portal do Saber bound in registry");
} catch(Exception e){
System.out.print("Exception starting RMI registry: " + e.getMessage());
e.printStackTrace();
}
try{
FileOutputStream osUCs = new FileOutputStream(ficheiroUCs);
ObjectOutputStream oOSUCs = new ObjectOutputStream(osUCs);
FileOutputStream osUsers = new FileOutputStream(ficheiroUsers);
ObjectOutputStream oOSUsers = new ObjectOutputStream(osUsers);
oOSUCs.writeObject(cadeiras);
oOSUsers.writeObject(utilizadores);
oOSUCs.close();
oOSUsers.close();
osUCs.close();
osUsers.close();
}catch(IOException e){
System.out.println(e.getMessage());
}
}
我已经尝试在构造函数中实例化所有对象(ArrayLists和Files),然后创建两个本地方法:一个用于将文件加载到ArrayLists,另一个用于将数据保存到文件中。但是我必须从main()内部调用这些方法!所以结果是一样的!
我知道如果我使用Java Swing或FX而不是文本模式,可能,我不会发现这种约束......但是,另一方面,必须有一个解决方案吗?正确?
我真的需要一些指导,因为我真的卡住了!
很多,非常感谢提前。
答案 0 :(得分:0)
你错了。
您正在序列化对象本身,而不是将它们作为成员包含在其中的对象或类,因此它们在该类中是静态的这一事实完全无关紧要。
您无需解决问题。