保存不同类型的对象

时间:2018-01-11 17:28:54

标签: java save serializable

我不确定我怎么能说出标题,但是这里有:

我有多个班级:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是通用的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<>() );