保存不同类型的 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<>() );
我不太确定我还能怎么说这个标题,但这里是:
我有多个 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<>() );