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

在Java中使用序列化的最佳方式是什么?,java,serialization,io,Java,Serialization,Io,我知道序列化是保存对象实例的一种快速方法,包括对象中的所有变量,不包括静态引用和用transient关键字标记的引用 我不太擅长I/O,我的应用程序有大约50个类,其中有三个不同的对象,其中包含对象 例如,我有一个Animal类、Employee类、Vehicle类。在运行时,所有包含实例对象的对象都包含自己的子类、方法等 我的问题是,通过序列化保存所有这些信息的最简单方法是什么?我和我的教授讨论过这个问题,他提出了一种类似于包含类数据的方法。类在任何事情上都有自己的手,然后序列化它。最终会将它

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

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

例如,我有一个Animal类、Employee类、Vehicle类。在运行时,所有包含实例对象的对象都包含自己的子类、方法等

我的问题是,通过序列化保存所有这些信息的最简单方法是什么?我和我的教授讨论过这个问题,他提出了一种类似于包含类数据的方法。类在任何事情上都有自己的手,然后序列化它。最终会将它引用的每个对象保存到.ser文件中

我想制作Data.class,然后制作我所有的50个类,扩展数据。 然后让我的save方法执行如下操作

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();
      }
}
然而,我似乎无法让这个工作。我相信这是因为我正在创建一个空白的数据实例,其中只包含所有子类的默认值。我调用这个函数的时候,我确实想在它们对应的对象中的所有值都被填充后保存,但是我做了一些错误的事情,无法弄清楚是什么

任何帮助都将不胜感激。我当然不必手动序列化三种不同类型对象的每个实例?它超过了300,我不想这样做


另外,我给了数据一个serialVersionID并实现了数据的serializable接口。

确保所有类都实现了serializable接口,并且该数据类具有序列化/反序列化动物、员工、车辆和其他类的方法

通过使用单个方法saveDataSerializable 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();
        }
    }
}

确保所有类都实现了Serializable接口,并且该数据类具有序列化/反序列化动物、员工、车辆和其他类的方法

通过使用单个方法saveDataSerializable 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();
        }
    }
}

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

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

不要将它们设置为静态,以免序列化。静态导致变量与类相关联,而不是与类的单个实例相关联,这可能会损害预期的行为。如果它们不是静态的,就使用transient。不要使它们成为静态的,这样它们就不会被序列化。静态导致变量与类相关联,而不是与类的单个实例相关联,这可能会损害预期的行为。如果它们不是静态的,就使用transient;应该是ommited,而不是序列化可序列化的;或者为数据对象本身序列化它。@M.M.是的,我在晚上回答了这个问题,所以我没有考虑。ThanksData myData=新数据;应该是ommited,而不是序列化可序列化的;或者为数据对象本身序列化它。@M.M.是的,我在晚上回答了这个问题,所以我没有考虑。谢谢