【问题标题】:ObjectOutputStream/Input Serializable in JAVAJAVA 中的 ObjectOutputStream/Input 可序列化
【发布时间】:2014-12-29 16:38:44
【问题描述】:

我正在使用ObjectOutputStream 将我的对象保存到.dat 文件中。 我的问题是,如果我更改对象的源代码(例如,我添加一个方法(getter)) 输入流无法加载数据并告诉我有关Serializable 的错误: 有可能解决这个问题吗?如果我更改我的源代码,我必须每次生成新的.dat 文件。

使用此方法: (DONT LOOK AT THE OBJECT TYPE-返回值) 保存

public void saveToFile(HeaderOfMapTeachStructure hm, String nameOfFile) {
    try (ObjectOutputStream os = new ObjectOutputStream(
            new FileOutputStream(nameOfFile + "." + this.TYPE_OF_FILE))) {
        os.writeObject(hm);
    } catch (IOException e) {
        System.out.println("Error: " + e);
    }
}

加载

public MapStandard loadFromFileMS(String nameOfFile) {
    MapStandard hm = null;
    InputStream inputStreaminputStream
            = getClass().getClassLoader().
            getResourceAsStream("data/" + nameOfFile + ".data");
    try {
        try (ObjectInputStream is = new ObjectInputStream(inputStreaminputStream)) {
            hm = (MapStandard) is.readObject();
        }
    } catch (IOException | ClassNotFoundException e) {
        System.out.println("Error: " + e);
    }
    return hm;
}

错误是:

Error: java.io.InvalidClassException: MapVerb.RealVerb; local class incompatible: stream classdesc serialVersionUID = -887510662644221872, local class serialVersionUID = 7992494764692933500

【问题讨论】:

    标签: java serializable


    【解决方案1】:

    这个问题可以解决吗?

    是的。序列化中断的原因是生成的版本号发生了变化。如果您明确指定它,它将不会生成,并且您将控制版本控制。这意味着您需要小心 - 如果您更改对象中的字段或这些字段的含义,您需要记住自己更改版本号。

    您可以这样指定序列化版本:

    // It doesn't have to be constant, but that's fairly common.
    private static final long serialVersionUID = ...; // Some constant
    

    有关更多信息,请参阅Serializable 的文档。

    您可能还想考虑使用替代方法来存储数据 - Java 中的默认二进制序列化相当脆弱。有很多替代方案 - 基于文本的格式,例如 XML、JSON 或 YAML,或二进制格式,例如 Protocol Buffers 或 Thrift。

    【讨论】:

    • 谢谢您的回复和帮助。
    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2012-10-01
    • 1970-01-01
    • 2012-04-04
    • 2011-09-04
    相关资源
    最近更新 更多