繁体   English   中英

序列化静态 ArrayList 对象

[英]Serialize static ArrayList objects

我正在使用 RMI 以文本模式构建这个客户端/服务器应用程序。 在这个应用程序中,我需要使用两个 ArrayLists,然后将它们保存到服务器端的两个文件中。

事实是,我必须在远程方法中操作这些 ArrayList(不将它们作为参数传递),因此,我必须声明它们并将它们在类中实例化为全局变量

问题是,当我准备main() 中的代码以最初将对象从文件加载到 ArrayLists 然后,就在 Server 终止之前,将 ArrayLists 保存到文件中时,我被迫将 ArrayLists 声明为静态因为我在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;
}

现在我将 ArrayLists 加载/保存到文件的main()部分:

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

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

很多,非常感谢。

你误会了。

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

你没有问题要解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM