gpt4 book ai didi

java - 在更改单个最终字段的类型时保持 Java 序列化兼容性

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:38 27 4
gpt4 key购买 nike

我有这个旧的便利类来处理日期 (yyyy-MM-dd)。它抽象出使用 java.util.DateCalendar 的一些丑陋之处,但我想根据 JodaTime LocalDate 重写它。 (我不会改变接口(interface),现在只是实现。)

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

如何用 final LocalDate 替换 final int 字段,但保持序列化兼容性?

我可以实现 writeObject 来写出兼容的 int 值而不是 LocalDate。但我不相信 readObjectreadResolve 允许我从流中读取 int 并写入 LocalDate , 无需诉诸反射(reflection)。

是否有类似静态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()方法:

For Serializable and Externalizable classes, the readResolve method allows a class to replace/resolve the object read from the stream before it is returned to the caller. By implementing the readResolve method, a class can directly control the types and instances of its own instances being deserialized. The method is defined as follows:

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

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

关于java - 在更改单个最终字段的类型时保持 Java 序列化兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17839661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com