2016-04-24 80 views
-1

我使用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而不是文本模式,可能我不會找到這種約束...但另一方面,必須有解決方案嗎?對?

我真的需要一些指導,因爲我真的被卡住了!

很多,很多預先感謝。

+0

這個問題沒有實際的RMI內容。 – EJP

回答

0

你錯了。

您正在序列化對象本身,而不是它們作爲成員包含的對象或類,因此它們在該類中是靜態的事實是完全不相關的。

你沒有問題要解決。

+0

那麼,我怎麼不能將數據保存到文件?!我一定做錯了什麼!也許是因爲我不確切知道應該發生什麼(在服務器終止前有哪些條件)才能確切知道將代碼保存到ArrayLists的位置並關閉所有OutputStreams! EJP:非常感謝啓蒙。現在我知道這不是因爲靜態環境。 – graundechefe

+0

我很抱歉,但對於Java而言,我有很多東西可以學習!我忘了提及名爲「cadeiras」的ArrayList包含來自另一個名爲「UC」的類的對象,並且這個對象在其內部具有另一個ArrayList,另一個類名爲「Exercicio」的對象等等......所有這些類是可序列化的。這是你所指的?!請原諒我的無知! – graundechefe

+0

我不知道你爲什麼不能'將數據保存到文件中',因爲你沒有提供任何*症狀*只有你錯誤的猜測。事實上,你甚至沒有說過它沒有用,只是你認爲它不會。如果您發現異常,請在您的問題中發佈。 – EJP