3

我有这个旧的方便类来操作日期(yyyy-MM-dd)。它抽象了一些使用的丑陋,java.util.DateCalendar我想用 JodaTime 重写它LocalDate。(我不会改变接口,现在只是实现。)

旧版本使用默认序列化,并且只有一个int字段。

如何final int用 a 替换该字段final LocalDate但保留序列化兼容性?

我可以实现writeObject写出兼容int值而不是LocalDate. 但我不相信readObjectreadResolve允许我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
}
4

1 回答 1

2

您可能正在寻找readResolve()方法:

对于 Serializable 和 Externalizable 类,readResolve 方法允许类在返回给调用者之前替换/解析从流中读取的对象。通过实现 readResolve 方法,一个类可以直接控制自己被反序列化的实例的类型和实例。该方法定义如下:

ANY-ACCESS-MODIFIER Object readResolve()
        throws ObjectStreamException;

因此,您需要使 LocalDate 字段瞬态,并使用 readResolve 类读取将读取的仅包含 int 字段的序列化对象转换为包含从 int 值创建的 LocalDate 的新实例。

于 2013-07-24T17:11:31.507 回答