2

我知道序列化是保存对象实例的一种快速方法,包括对象中的所有变量,不包括静态引用和用瞬态关键字标记的引用。

我不太擅长 I/O,我的应用程序有大约 50 个类,其中有三个不同的对象(其中包含对象)。

例如,我有一个Animal ClassEmployee ClassVehicle 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 的可序列化接口。

4

2 回答 2

4

确保您的所有类都实现了该Serializable接口,并且此类Data具有序列化/反序列化您的AnimalEmployeeVehicle其他类的方法。

您可以通过一个方法轻松地做到这一点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();
        }
    }
}
于 2012-11-11T04:39:50.550 回答
0

将您不想序列化的任何变量标记为瞬态或静态。如果您需要更多信息或好奇,请查看此处。

于 2012-11-11T04:42:15.097 回答