据我所知,序列化是保存对象实例的快捷方式,包括对象中的所有变量,不包括静态引用和使用transient关键字标记的引用。
我对I / O不是很好,我的应用程序有大约50个类,其中有三个不同的不同对象(其中包含对象)。
例如,我有一个 Animal Class , Employee Class , Vehicle Class 。所有包含实例对象的,在运行时,包含它们自己的子类,方法等。
我的问题是,使用序列化保存所有这些信息的最简单方法是什么?我和我的教授一起讨论过这个问题,他提出了类似于“ Data.class ”的内容,它在所有内容中都有“手”,然后将其序列化。哪个会最终保存它引用的.ser文件的每个对象。
我考虑过制作“ Data.class ”,然后制作所有50个类,扩展 Data 。 然后让我的保存方法执行类似
的操作public void saveData(){
Data myData = new Data()
try
{
FileOutputStream fileOut =
new FileOutputStream("Data.ser");
ObjectOutputStream out =
new ObjectOutputStream(fileOut);
out.writeObject(myData);
out.close();
fileOut.close();
}catch(IOException i)
{
i.printStackTrace();
}
}
然而,我似乎无法让这个工作。我相信这是因为我正在创建一个空白的Data实例,它只包含所有子类的默认值。我在打算保存时调用该函数(在相应对象中的所有值都填满之后),但是我做错了什么并且无法弄清楚是什么。
非常感谢任何帮助。当然,我不必手动序列化三种不同类型对象的每个实例?它超过300,我宁愿不这样做。
另外,我确实给Data一个serialVersionID并实现了Data的可序列化接口。
答案 0 :(得分:4)
确保所有类都实现了Serializable
接口,并且此Data
类具有序列化/反序列化Animal
,Employee
,Vehicle
和其他课程。
您可以通过单一方法saveData(Serializable serializable, String fileName)
轻松完成此操作。这将是满足您需求的骨架(基于您的实际代码):
public class Data {
public void saveData(Serializable serializable, String fileName) {
try {
FileOutputStream fileOut = new FileOutputStream(fileName);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(myData);
out.close();
fileOut.close();
} catch(IOException i) {
i.printStackTrace();
}
}
}
答案 1 :(得分:0)
标记您不希望序列化为瞬态或静态的任何变量。如果您需要更多信息或感到好奇,请查看here。