支持的类型
本页记录 Fory C++ 序列化支持的所有类型。
基本类型
所有 C++ 基本类型都支持高效的二进制编码:
| 类型 | 大小 | Fory TypeId | 说明 |
|---|---|---|---|
bool | 1 字节 | BOOL | True/false |
int8_t | 1 字节 | INT8 | 有符号字节 |
uint8_t | 1 字节 | INT8 | 无符号字节 |
int16_t | 2 字节 | INT16 | 有符号短整型 |
uint16_t | 2 字节 | INT16 | 无符号短整型 |
int32_t | 4 字节 | INT32 | 有符号整型 |
uint32_t | 4 字节 | INT32 | 无符号整型 |
int64_t | 8 字节 | INT64 | 有符号长整型 |
uint64_t | 8 字节 | INT64 | 无符号长整型 |
float | 4 字节 | FLOAT32 | IEEE 754 单精度 |
double | 8 字节 | FLOAT64 | IEEE 754 双精度 |
char | 1 字节 | INT8 | 字符(作为有符号) |
char16_t | 2 字节 | INT16 | 16 位字符 |
char32_t | 4 字节 | INT32 | 32 位字符 |
int32_t value = 42;
auto bytes = fory.serialize(value).value();
auto decoded = fory.deserialize<int32_t>(bytes).value();
assert(value == decoded);
字符串类型
| 类型 | Fory TypeId | 说明 |
|---|---|---|
std::string | STRING | UTF-8 编码 |
std::string_view | STRING | 零拷贝视图(读取) |
std::u16string | STRING | UTF-16(转换) |
binary | BINARY | 无长度的原始字节 |
std::string text = "Hello, World!";
auto bytes = fory.serialize(text).value();
auto decoded = fory.deserialize<std::string>(bytes).value();
assert(text == decoded);
集合类型
Vector / List
std::vector<T> 支持任何可序列化的元素类型:
std::vector<int32_t> numbers{1, 2, 3, 4, 5};
auto bytes = fory.serialize(numbers).value();
auto decoded = fory.deserialize<std::vector<int32_t>>(bytes).value();
// 嵌套 vector
std::vector<std::vector<std::string>> nested{
{"a", "b"},
{"c", "d", "e"}
};
Set
std::set<T> 和 std::unordered_set<T>:
std::set<std::string> tags{"cpp", "serialization", "fory"};
auto bytes = fory.serialize(tags).value();
auto decoded = fory.deserialize<std::set<std::string>>(bytes).value();
std::unordered_set<int32_t> ids{1, 2, 3};
Map
std::map<K, V> 和 std::unordered_map<K, V>:
std::map<std::string, int32_t> scores{
{"Alice", 100},
{"Bob", 95}
};
auto bytes = fory.serialize(scores).value();
auto decoded = fory.deserialize<std::map<std::string, int32_t>>(bytes).value();
// 无序 map
std::unordered_map<int32_t, std::string> lookup{
{1, "one"},
{2, "two"}
};
智能指针
std::optional
任何类型的可空包装:
std::optional<int32_t> maybe_value = 42;
std::optional<int32_t> empty_value = std::nullopt;
auto bytes = fory.serialize(maybe_value).value();
auto decoded = fory.deserialize<std::optional<int32_t>>(bytes).value();
assert(decoded.has_value() && *decoded == 42);
std::shared_ptr
带引用跟踪的共享所有权:
auto shared = std::make_shared<Person>("Alice", 30);
auto bytes = fory.serialize(shared).value();
auto decoded = fory.deserialize<std::shared_ptr<Person>>(bytes).value();
启用引用跟踪(track_ref(true))时:
- 共享对象只序列化一次
- 对同一对象的引用被保留
- 循环引用自动处理
std::unique_ptr
独占所有权:
auto unique = std::make_unique<Person>("Bob", 25);
auto bytes = fory.serialize(unique).value();
auto decoded = fory.deserialize<std::unique_ptr<Person>>(bytes).value();
Variant 类型
std::variant<Ts...> 用于类型安全的联合:
using MyVariant = std::variant<int32_t, std::string, double>;
MyVariant v1 = 42;
MyVariant v2 = std::string("hello");
MyVariant v3 = 3.14;
auto bytes = fory.serialize(v1).value();
auto decoded = fory.deserialize<MyVariant>(bytes).value();
assert(std::get<int32_t>(decoded) == 42);
std::monostate
空 variant 替代:
using OptionalInt = std::variant<std::monostate, int32_t>;
OptionalInt empty = std::monostate{};
OptionalInt value = 42;