改变类型的库 Class 的反序列化

Deserialization of a Libary Class that Changed Type

我想将我的 JfreeChart 1.0.9 更新到 1.0.19。 在我的应用程序中,我通过序列化将一些对象保存在一个 zip 中,并加载它我再次反序列化它。 (简单的) 现在,当我将 JFreeChart 更新到新版本时,JfreeChart 的 DataRange Class 给我带来了麻烦。

我收到这个错误:

Errror occured while importing a project: java.io.InvalidClassException: org.jfree.data.time.DateRange; incompatible types for field lowerDate

我分析了DateRange的class,也发现了问题

DateRange.java 1.0.9:

public class DateRange extends Range implements Serializable {

    /** For serialization. */
    private static final long serialVersionUID = -4705682568375418157L;

    /** The lower bound for the range. */
    private Date lowerDate;

    /** The upper bound for the range. */
    private Date upperDate;
...

DateRange.java 1.0.19:

public class DateRange extends Range implements Serializable {

    /** For serialization. */
    private static final long serialVersionUID = -4705682568375418157L;

    /** The lower bound for the range. */
    private long lowerDate;

    /** The upper bound for the range. */
    private long upperDate;
...

你应该看到问题了。字段 lowerDate 和 upperDate 的类型由 java.util.Date 更改为 long。 现在我无法再次反序列化现有项目。 (对于新项目,这不是问题)

你有解决方法吗?

我修复它的唯一想法是修改源代码并将以下方法添加到此处解释的 DateRange.java:Serialization

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
}

但我不想在可能的情况下修改 jfreechart。

我自己解决了。 我更改了 DateRange.java 并将 lowerDate 和 upperDate 的类型从 long 修改为 Date。 (这不是很好的解决方案)

使用 readObject 它不起作用,因为当我反序列化其他对象时出现 EOFException。

如果有人有更好的解决方案,我想听听。