跳到主要内容
版本:dev

引用

启用 TrackRef(true) 后,Apache Fory™ C# 可以保留共享引用和循环引用。

启用引用跟踪

Fory fory = Fory.Builder()
.TrackRef(true)
.Build();

启用后:

  • 保留共享对象标识。
  • 可以安全地序列化和反序列化循环对象图。

外部类型序列化处理的可变类使用相同的引用跟踪。外部结构体仍是内联值。

循环引用示例

using Apache.Fory;

[ForyStruct]
public sealed class Node
{
public int Value { get; set; }
public Node? Next { get; set; }
}

Fory fory = Fory.Builder()
.TrackRef(true)
.Build();
fory.Register<Node>(200);

Node node = new() { Value = 7 };
node.Next = node;

byte[] payload = fory.Serialize(node);
Node decoded = fory.Deserialize<Node>(payload);

// The cycle is preserved.
System.Diagnostics.Debug.Assert(object.ReferenceEquals(decoded, decoded.Next));

何时使用 TrackRef(false)

对于不关心引用标识的树形无环数据,TrackRef(false) 可以更快。

C# union 包装器不可变,并在读取其 case 载荷后创建。不支持从 union case 载荷返回包含该载荷的 union 的引用环;Fory 会拒绝未解析引用,而不是返回不完整的 union。

相关主题