迁移指南
本页介绍从 JDK 序列化迁移以及在 Fory 版本之间升级的策略。
JDK 序列化迁移
如果你之前使用 JDK 序列化,并且无法同时升级客户端和服务器(这对于在线应用程序很常见),Fory 提供了一个实用方法 org.apache.fory.serializer.JavaSerializer.serializedByJDK 来检查二进制是否由 JDK 序列化生成。
你可以使用以下模式使现有序列化协议感知,然后以异步滚动方式升级序列化到 Fory:
if (JavaSerializer.serializedByJDK(bytes)) {
ObjectInputStream objectInputStream = xxx;
return objectInputStream.readObject();
} else {
return fory.deserialize(bytes);
}
这允许你:
- 部署可以同时读取 JDK 和 Fory 序列化数据的新代码
- 逐步将序列化迁移到 Fory
- 最终移除 JDK 序列化支持
升级 Fory
小版本升级
目前,仅为小版本提供二进制兼容性。例如,如果你使用 Fory v0.2.0,如果升级到 Fory v0.2.1,将提供二进制兼容性。
如果你按小版本升级,或者你不会有旧版 Fory 序列化的数据,你可以直接升级 Fory,无需任何特殊处理。
大版本升级
如果你从 v0.2.x 升级到 Fory v0.4.1,则不保证二进制兼容性。
大多数时候不需要升级 Fory 到更新的大版本——当前版本已经足够快速和紧凑,我们为最近的旧版本提供一些小修复。
为序列化数据添加版本
如果你确实想升级 Fory 以获得更好的性能和更小的大小,你需要将 Fory 版本作为头部写入序列化数据,使用如下代码来保持二进制兼容性:
带版本头的序列化
MemoryBuffer buffer = xxx;
buffer.writeVarInt32(2); // 写入 Fory 版本
fory.serialize(buffer, obj);
带版本头的反序列化
MemoryBuffer buffer = xxx;
int foryVersion = buffer.readVarInt32();
Fory fory = getFory(foryVersion);
fory.deserialize(buffer);
getFory 是一个加载相应 Fory 版本的方法。你可以将不同版本的 Fory shade 和 relocate 到不同的包,并按版本加载 Fory。
Shading 示例
<!-- Maven Shade Plugin 配置用于多个 Fory 版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>shade-fory-v1</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>org.apache.fory</pattern>
<shadedPattern>com.myapp.fory.v1</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
最佳实践
- 升级前彻底测试:确保与现有序列化数据的兼容性
- 对长期存储使用版本头:如果数据在 Fory 版本之间持久化
- 保持向后兼容性:保留旧版本 Fory 以读取遗留数据
- 升级后监控:在生产环境中注意反序列化错误