Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-更新/更改序列化类_Java_Serialization_Save_Load_Updating - Fatal编程技术网

Java-更新/更改序列化类

Java-更新/更改序列化类,java,serialization,save,load,updating,Java,Serialization,Save,Load,Updating,我正在为一家小企业创建一个项目。该程序旨在具有较小的模块,这些模块在开发时将附加到程序的其余部分。它包含一个“Article”和一个“Category”类,它们包含在“ArticleDatabase”类的列表中。 此类被序列化并保存到硬盘驱动器的文件中。 Register模块已完成,“Receipt”类同样包含在“RegisterDatabase”类的列表中,该类被序列化并保存到单独的文件中。 系统设置以相同的方式保存 但是,现在我正在设计一个Invoice模块,发现我需要向“Article”类

我正在为一家小企业创建一个项目。该程序旨在具有较小的模块,这些模块在开发时将附加到程序的其余部分。它包含一个“Article”和一个“Category”类,它们包含在“ArticleDatabase”类的列表中。 此类被序列化并保存到硬盘驱动器的文件中。 Register模块已完成,“Receipt”类同样包含在“RegisterDatabase”类的列表中,该类被序列化并保存到单独的文件中。 系统设置以相同的方式保存

但是,现在我正在设计一个Invoice模块,发现我需要向“Article”类和系统数据添加一个字段

现在正在使用寄存器,它包含需要保存的实际数据,因此我不能只更改类,因为在加载时会出现InvalidClassException

因为我知道这在将来也是一个常见的问题,所以我需要一些关于如何解决这个问题的建议

我如何设置一个系统i,从一个类中保存一个文件,并将数据加载到这个类的更新或新版本中,或者我应该以一种全新的方式来处理这个问题

我曾尝试将旧文件中的数据加载到一个添加了所需字段的重复类中,但重新配置程序以使用新文件是一项非常繁琐的任务,如果我必须时不时地这样做,那么做会浪费大量时间

保存加载的方法如下所示:

 public void saveArticleDB() throws IOException {
        // Write to disk with FileOutputStream
        FileOutputStream f_out = new FileOutputStream("articles.data");

        // Write object with ObjectOutputStream
        ObjectOutputStream obj_out = new ObjectOutputStream(f_out);

        obj_out.writeObject(MyMain.articleDB);
    }

    public ArticleDB loadArticleDB() throws IOException {

        try {
            FileInputStream f_in = new FileInputStream("articles.data");
            ObjectInputStream obj_in = new ObjectInputStream(f_in);
            Object obj = obj_in.readObject();

            if (obj instanceof ArticleDB) {
                return (ArticleDB) obj;
            } else return null;

        } catch (FileNotFoundException e) {
            new MessageDialog("Article DB - File not found");
            return null;
        } catch (InvalidClassException e) {
            new MessageDialog("Article DB - Class didnt match");
            return null;
        } catch (ClassNotFoundException e) {
            new MessageDialog("Article DB - Class not found");
            return null;
        }
    }
将数据传递到保存文件、实现可序列化的类,这是用于保存和加载类的唯一代码

这是我第一次尝试序列化、保存和加载,这意味着我对这方面相当陌生,因此了解/理解很少关于这些主题的概念


非常感谢您的建议:-)

如果您想要向后兼容,那么默认的Java序列化就不是一条可行之路。有很多选择,从XML到JSON再到GPB。我建议探索这些备选方案,然后在必要时提出一个关于您选择的问题。如果您强烈需要使用java序列化(设计用于通过RPC、消息队列等在多个JVM实例之间交换对象,而不是用于存储),请在类中实现,以使它们更具吸引力“版本独立“它不必序列化。当我在谷歌上搜索save/load时,这只是最常见的主题。我只需要一些东西,使我可以保存/加载到常规硬盘上的文件,并以某种方式支持我可以加载到更新的对象中。如果您只是向类中添加一个字段,并确保保持与以前相同的serialVersionUid,您仍然能够读取序列化类的旧版本。新字段将只具有其默认值。但是序列化对于长期存储来说是一个糟糕的选择。使用JSON(或XML,但我更喜欢JSON),这样即使您想要对模型进行完全更改,您仍然能够使用旧格式读取旧文件,并将其迁移到新格式。或者只使用一个关系数据库,它允许执行SQL脚本将模式从一个版本迁移到另一个版本。如果您希望向后兼容,那么默认的Java序列化就不是一种方法。有很多选择,从XML到JSON再到GPB。我建议探索这些备选方案,然后在必要时提出一个关于您选择的问题。如果您强烈需要使用java序列化(设计用于通过RPC、消息队列等在多个JVM实例之间交换对象,而不是用于存储),请在类中实现,以使它们更具吸引力“版本独立“它不必序列化。当我在谷歌上搜索save/load时,这只是最常见的主题。我只需要一些东西,使我可以保存/加载到常规硬盘上的文件,并以某种方式支持我可以加载到更新的对象中。如果您只是向类中添加一个字段,并确保保持与以前相同的serialVersionUid,您仍然能够读取序列化类的旧版本。新字段将只具有其默认值。但是序列化对于长期存储来说是一个糟糕的选择。使用JSON(或XML,但我更喜欢JSON),这样即使您想要对模型进行完全更改,您仍然能够使用旧格式读取旧文件,并将其迁移到新格式。或者只使用关系数据库,它允许执行SQL脚本将模式从一个版本迁移到另一个版本