保存不同类型的 objects

Saving different types of objects

我不太确定我还能怎么说这个标题,但这里是:

我有多个 classes:

DamageType
Proficiencies
Race

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

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

但是,当从文件中检索 object 时,它 returns 作为 Serializable 接口,我无法将该接口转换为 class。

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 方法?

您可以有一个抽象的 classe,例如表单示例 "SerFile",其中包含 createFile 方法的实现。每个 class 都应该扩展那个摘要 class.

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

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<>() );