在Java中使用序列化的最佳方法是什么?

时间:2012-11-11 04:34:35

标签: java serialization io

据我所知,序列化是保存对象实例的快捷方式,包括对象中的所有变量,不包括静态引用和使用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的可序列化接口。

2 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:0)

标记您不希望序列化为瞬态或静态的任何变量。如果您需要更多信息或感到好奇,请查看here