【问题标题】:Saving different types of objects保存不同类型的对象
【发布时间】:2018-06-21 02:53:52
【问题描述】:

我不太确定我还能如何陈述标题,但这里是:

我有多个课程:

DamageType
Proficiencies
Race

这些都需要保存到 .ser 文件中。我想我可以通过为所有 3 个创建一个单一的方法来节省时间,所以我需要一个解析所有这些对象的保存方法。我让这些类实现了Serializable,这样我就可以创建以下方法:

createFile(Serializable object){
    File file = new File("./src/"+object+".ser");
    file.createNewFile();
    fout = new FileOutputStream(file);
    oos = new ObjectOutputStream(fout);
    oos.writeObject(object);
}

但是,当从文件中检索对象时,它以Serializable 接口的形式返回,我无法将该接口转换为类。

public static ArrayList<Serializable> readFolder(File folder, ArrayList<String> exceptions) {
    ArrayList<Serializable> objects = new ArrayList<Serializable>();
    for (File fileEntry : folder.listFiles()) {
        if (!(exceptions.contains(fileEntry.getName()))) {
            if (fileEntry.isDirectory()) {
                readFolder(fileEntry, exceptions);
            } else {
                objects.add(fileEntry);
            }
        }
    }
    return objects;
}

我还能怎么做?我是否必须硬着头皮为每个人创建一个createFile 方法?

【问题讨论】:

  • 我没有看到您在 createFile 方法中从文件中检索对象的位置。
  • @tsolakp 我会用检索代码更新帖子
  • 你知道每个反序列化类的预期类型是什么吗?
  • 我不确定你的意思,但是所有的类都在不同的文件夹中。因此,ArrayList 应该只包含一个类。
  • 因此,在特定文件夹下,您将只有DamageType 类型的对象的序列化文件,而在不同文件夹下只有Proficiencies 的序列化文件?

标签: java save serializable


【解决方案1】:

这里是通用的readFolder 读取对象,假设在给定文件夹/文件下存在相同类型的序列化对象并且不遍历子文件夹。

public static <T extends Serializable> List<T> readFolder(Class<T> clazz, File file, List<String> exceptions){
    File[] files = file.isDirectory() ? file.listFiles() : new File[]{file};

    List<T> objects = new ArrayList<T>();

    for ( File f : files ){
        try (ObjectInputStream ois = new ObjectInputStream( new FileInputStream(f) ) ) {
            T object = clazz.cast( ois.readObject() );
            objects.add(object);
        } catch (Exception e) {
            exceptions.add( e.getMessage() );  
        }
    }        
    return objects;
}

你可以这样称呼它:

List<DamageType> dts = readFolder( DamageType.class, new File(""), new ArrayList<>() );

【讨论】:

    【解决方案2】:

    您可以有一个抽象类,如表单示例“SerFile”,其中实现了 createFile 方法。每个类都应该扩展那个抽象类。

    【讨论】:

    • 我需要保存的一些类正在扩展其他抽象类。
    • 好的,也许我需要孔图来提供最佳解决方案。您还可以将类保存为另一种格式,例如 json。然后在阅读时您可以映射到特定的类。
    • 我对 json 不熟悉。有什么文章可以指导我如何使用它,尤其是在这种情况下?
    • 谢谢!我认为这将非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2017-08-23
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多