【问题标题】:How to get a particular instance of serialized object from file?如何从文件中获取序列化对象的特定实例?
【发布时间】:2021-04-22 15:19:15
【问题描述】:

假设,我创建了一个名为 Worker 的类。

public class Worker implements Serializable{
    String username, password;
} 

也就是说,在主函数/与此类一起使用的任何其他方法中,我创建了几个实例。

Worker first = new Worker("Arty", "Sif");  //Worker(String name, String pass)
Worker second = new Worker("Sirius", "Pass");

然后我将它们存储在一个文件中,例如使用 objectoutputstream 的“store.bin”。 我的问题是,如果我在运行时想要一个特定的实例,例如 Sirius,除了读取加载每个对象的整个文件并将它们与实例的唯一字段进行比较之外,还有其他方法可以获得它吗?因为这样做会花费很多时间。 提前致谢。

【问题讨论】:

标签: java


【解决方案1】:

嗯,已经有为此设计的工具,它们是数据库。他们完全按照您的描述行事。

甚至还有一个叫做 SQLite,它甚至可以执行您所描述的实现,将数据存储为二进制文件,例如 sqlite.db

【讨论】:

    【解决方案2】:

    您似乎在做的是每次有人要求特定工作人员时读取文件;你不应该这样做。只需读取一次文件并将所有结果放入Map

    class PasswordLoader {
      Map<String, String> users = new HashMap<>();
      public WorkerManager(String filename) {
        List<Worker> all = readFromFile(filename);
        for (Worker worker : all) {
          users.put(worker.getName(), worker.getPassword());
        }
      }
    
      public String getPasswordForUsername(String username) {
        return users.get(username);
      }
    }
    

    它确实有几个问题;例如,如果添加了新的工人,文件将被更新,但地图不会。最好通过此类路由所有 Worker 管理(添加、删除、查询等),以便它可以保持最新状态。这样做的另一个好处是,如果您想稍后更改数据的存储方式(例如,使用数据库),您只需要更改这一个类,因为它是唯一与 Workers 存储方式相关的类。

    此外,密码永远不应存储为Strings;由于字符串在 Java 中的存储方式,这是一个安全问题;即使你用完它,它也可能会留在记忆中。

    正如我在评论中所写,使用 Java 序列化也不是一个好主意,但既然你已经把它弄下来了,时间紧迫,而且它不是一个生产项目,我想它会做的。

    【讨论】:

      猜你喜欢
      • 2022-08-15
      • 1970-01-01
      • 2012-01-31
      • 2013-07-13
      • 1970-01-01
      • 2020-05-01
      • 2021-11-20
      • 1970-01-01
      • 2019-06-19
      相关资源
      最近更新 更多