【问题标题】:What is the best way to use Serialization in Java?在 Java 中使用序列化的最佳方法是什么?
【发布时间】:2012-10-30 23:38:49
【问题描述】:

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

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

例如,我有一个动物类员工类车辆类。所有这些都包含实例对象,在运行时,它们包含自己的子类、方法等。

我的问题是,用序列化保存所有这些信息的最简单方法是什么?我已经和我的教授讨论过这个问题,他提出了一个类似于“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 的可序列化接口。

【问题讨论】:

    标签: java serialization io


    【解决方案1】:

    确保您的所有类都实现了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();
            }
        }
    }
    

    【讨论】:

    • Data myData = new Data(); 应该被省略,而是序列化 serializable... ;)
    • 或为 Data 对象本身序列化 this
    • @M.M.是的,我晚上回答了这个,所以我没有考虑。谢谢
    【解决方案2】:

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

    【讨论】:

    • 不要将它们设为静态,以免它们被序列化。静态导致变量与类相关联,而不是与类的单个实例相关联,这可能会破坏预期的行为。如果它们不是静态的,只需使用瞬态。
    猜你喜欢
    • 2012-03-31
    • 2021-10-24
    • 2013-07-29
    • 2010-09-27
    • 2010-09-10
    • 2019-06-01
    • 1970-01-01
    • 2010-11-20
    • 2015-01-29
    相关资源
    最近更新 更多