更改单个final字段的类型时保持Java序列化兼容性
我有一个旧的方便类来处理日期(yyyy-MM-dd)。它消除了使用更改单个final字段的类型时保持Java序列化兼容性,java,serialization,deserialization,Java,Serialization,Deserialization,我有一个旧的方便类来处理日期(yyyy-MM-dd)。它消除了使用java.util.Date和Calendar的一些丑陋之处,但我想用JodaTimeLocalDate重写它。(我不会更改接口,现在只更改实现。) 旧版本使用默认序列化,只有一个int字段 如何用final LocalDate替换final int字段,但保留序列化兼容性? 我可以实现writeObject来写出兼容的int值,而不是LocalDate。但我不相信readObject或readResolve允许我从流中读取int
java.util.Date
和Calendar
的一些丑陋之处,但我想用JodaTimeLocalDate
重写它。(我不会更改接口,现在只更改实现。)
旧版本使用默认序列化,只有一个int
字段
如何用final LocalDate
替换final int
字段,但保留序列化兼容性?
我可以实现writeObject
来写出兼容的int
值,而不是LocalDate
。但我不相信readObject
或readResolve
允许我从流中读取int
,并编写LocalDate
,而无需借助反射
是否有类似于静态的readInstantiate
方法?还是一种聪明的方法,在保持兼容性的情况下使用序列化代理来实现这一点
当前代码:
public final class MyDay implements Serializable {
private static final long serialVersionUID = 12345L;
private final int isoDate;
public MyDay(int isoDate) {
this.isoDate = isoDate;
}
// lots of convenience methods for manipulating dates
// no read/writeObject serialization methods in original
}
您可能正在寻找以下方法: 对于可序列化和可外部化的类,readResolve方法允许类在将从流读取的对象返回给调用方之前替换/解析该对象。通过实现readResolve方法,类可以直接控制反序列化自身实例的类型和实例。该方法定义如下:
因此,您需要使LocalDate字段暂时化,并使用readResolve类将只包含int字段的已读序列化对象读转换为包含从int值创建的LocalDate的新实例。因此我需要保留
int
字段。这会起作用,但是需要额外的字段是一个(小)遗憾。不,您不需要保留int字段。只需要准备好阅读并忽略它。可以尝试将新旧版本序列化。然后使用旧版本的序列化表单读入新版本@joe kearneyButreadResolve
没有提供流,因此您无法从那里读取int
的值。默认序列化显然不会在任何地方写入int,那么从哪里获得初始化LocalDate所用的值呢?
ANY-ACCESS-MODIFIER Object readResolve()
throws ObjectStreamException;