基础序列化
本页介绍 Apache Fory™ C# 中的强类型序列化 API。
对象图序列化
在类或结构体上使用 [ForyObject],并在使用前完成注册。
using Apache.Fory;
[ForyObject]
public sealed class Address
{
public string Street { get; set; } = string.Empty;
public int Zip { get; set; }
}
[ForyObject]
public sealed class Person
{
public long Id { get; set; }
public string Name { get; set; } = string.Empty;
public string? Nickname { get; set; }
public List<int> Scores { get; set; } = [];
public List<Address> Addresses { get; set; } = [];
}
Fory fory = Fory.Builder().Build();
fory.Register<Address>(100);
fory.Register<Person>(101);
Person person = new()
{
Id = 42,
Name = "Alice",
Nickname = null,
Scores = [10, 20, 30],
Addresses = [new Address { Street = "Main", Zip = 94107 }],
};
byte[] payload = fory.Serialize(person);
Person decoded = fory.Deserialize<Person>(payload);
强类型 API
使用字节数组进行序列化 / 反序列化
byte[] payload = fory.Serialize(value);
MyType decoded = fory.Deserialize<MyType>(payload);
从 ReadOnlySpan<byte> 反序列化
ReadOnlySpan<byte> span = payload;
MyType decoded = fory.Deserialize<MyType>(span);
流式帧消费
using System.Buffers;
ReadOnlySequence<byte> sequence = GetFramedSequence();
MyType first = fory.Deserialize<MyType>(ref sequence);
MyType second = fory.Deserialize<MyType>(ref sequence);
通过通用对象 API 处理动态载荷
当编译期类型未知或载荷本身是异构数据时,可使用 object? 版本的通用 API。
Dictionary<object, object?> value = new()
{
["k1"] = 7,
[2] = "v2",
[true] = null,
};
byte[] payload = fory.Serialize<object?>(value);
object? decoded = fory.Deserialize<object?>(payload);
Buffer Writer API(缓冲写入器)
可直接序列化到 IBufferWriter<byte> 目标中。
using System.Buffers;
ArrayBufferWriter<byte> writer = new();
fory.Serialize(writer, value);
ArrayBufferWriter<byte> dynamicWriter = new();
fory.Serialize<object?>(dynamicWriter, value);
说明
- 复用同一个
Fory或ThreadSafeFory实例可获得更好的性能。 - 基础类型和集合类型无需用户手动注册。
- 用户自定义的
[ForyObject]类型以及自定义序列化器类型应显式注册。