我使用RMI在文本模式上構建此客戶端/服務器應用程序。 在這個應用程序中,我需要使用兩個ArrayLists,然後將它們保存到服務器端的兩個文件。Serialize靜態ArrayList對象
的是,我必須在操作遠程方法這些的ArrayList(而不是將它們作爲參數),因此,我必須聲明它們在班上擔任全局變量實例化它們。
問題是,當我準備代碼在main()最初加載對象從文件到ArrayLists,然後,就在服務器終止之前,將ArrayLists保存到文件,,,我強迫聲明ArrayList爲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()其中i加載/保存的ArrayList的文件:
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());
}
}
我已經嘗試過以實例的所有對象(的ArrayList和文件)的構造函數,然後創建兩個方法:一個載入的文件到的ArrayList,另一個保存達ta到文件。但是,我必須從main()內部調用這些方法!所以結果是一樣的!
我知道如果我使用Java Swing或FX而不是文本模式,可能我不會找到這種約束...但另一方面,必須有解決方案嗎?對?
我真的需要一些指導,因爲我真的被卡住了!
很多,很多預先感謝。
這個問題沒有實際的RMI內容。 – EJP