序列化静态ArrayList对象

时间:2016-04-24 01:06:20

标签: java serialization arraylist

我正在使用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而不是文本模式,可能,我不会发现这种约束......但是,另一方面,必须有一个解决方案吗?正确?

我真的需要一些指导,因为我真的卡住了!

很多,非常感谢提前。

1 个答案:

答案 0 :(得分:0)

你错了。

您正在序列化对象本身,而不是将它们作为成员包含在其中的对象或类,因此它们在该类中是静态的这一事实完全无关紧要。

您无需解决问题。