Schema 演化
Apache Fory™ 在 Compatible 模式下支持 schema 演化,允许序列化和反序列化双方拥有不同的类型定义。
Compatible 模式
使用 compatible(true) 启用 schema 演化:
#include "fory/serialization/fory.h"
using namespace fory::serialization;
// 版本 1:原始 schema
struct PersonV1 {
std::string name;
int32_t age;
};
FORY_STRUCT(PersonV1, name, age);
// 版本 2:添加 email 字段
struct PersonV2 {
std::string name;
int32_t age;
std::string email; // 新字段
};
FORY_STRUCT(PersonV2, name, age, email);
int main() {
// 为每个 schema 版本创建单独的 Fory 实例
auto fory_v1 = Fory::builder()
.compatible(true) // 启用 schema 演化
.xlang(true)
.build();
auto fory_v2 = Fory::builder()
.compatible(true)
.xlang(true)
.build();
// 使用相同的类型 ID 进行 schema 演化
constexpr uint32_t PERSON_TYPE_ID = 100;
fory_v1.register_struct<PersonV1>(PERSON_TYPE_ID);
fory_v2.register_struct<PersonV2>(PERSON_TYPE_ID);
// 使用 V1 序列化
PersonV1 v1{"Alice", 30};
auto bytes = fory_v1.serialize(v1).value();
// 反序列化为 V2 - email 获得默认值(空字符串)
auto v2 = fory_v2.deserialize<PersonV2>(bytes).value();
assert(v2.name == "Alice");
assert(v2.age == 30);
assert(v2.email == ""); // 缺失字段的默认值
return 0;
}
Schema 演化特性
Compatible 模式支持以下 schema 变更:
| 变更类型 | 支持 | 行为 |
|---|---|---|
| 添加新字段 | ✅ | 缺失字段使用默认值 |
| 删除字段 | ✅ | 额外字段被跳过 |
| 重排字段顺序 | ✅ | 按名称匹配字段,而非位置 |