Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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
更改单个final字段的类型时保持Java序列化兼容性_Java_Serialization_Deserialization - Fatal编程技术网

更改单个final字段的类型时保持Java序列化兼容性

更改单个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

我有一个旧的方便类来处理日期(yyyy-MM-dd)。它消除了使用
java.util.Date
Calendar
的一些丑陋之处,但我想用JodaTime
LocalDate
重写它。(我不会更改接口,现在只更改实现。)

旧版本使用默认序列化,只有一个
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 kearneyBut
readResolve
没有提供流,因此您无法从那里读取
int
的值。默认序列化显然不会在任何地方写入int,那么从哪里获得初始化LocalDate所用的值呢?
ANY-ACCESS-MODIFIER Object readResolve()
        throws ObjectStreamException;