高级特性
本页介绍高级特性,包括零拷贝序列化、深拷贝、内存管理和日志记录。
零拷贝序列化
Fory 支持零拷贝序列化,以高效处理大型二进制数据:
import org.apache.fory.*;
import org.apache.fory.config.*;
import org.apache.fory.serializer.BufferObject;
import org.apache.fory.memory.MemoryBuffer;
import java.util.*;
import java.util.stream.Collectors;
public class ZeroCopyExample {
// 注意 fory 实例应该复用,而不是每次都创建。
static Fory fory = Fory.builder()
.withLanguage(Language.JAVA)
.build();
public static void main(String[] args) {
List<Object> list = Arrays.asList("str", new byte[1000], new int[100], new double[100]);
Collection<BufferObject> bufferObjects = new ArrayList<>();
byte[] bytes = fory.serialize(list, e -> !bufferObjects.add(e));
List<MemoryBuffer> buffers = bufferObjects.stream()
.map(BufferObject::toBuffer).collect(Collectors.toList());
System.out.println(fory.deserialize(bytes, buffers));
}
}
对象深拷贝
Fory 提供高效的深拷贝功能:
启用引用跟踪
Fory fory = Fory.builder().withRefCopy(true).build();
SomeClass a = xxx;
SomeClass copied = fory.copy(a);
禁用引用跟踪(更好的性能)
禁用时,深拷贝将忽略循环引用和共享引用。对象图的相同引用将在一次 Fory#copy 中被复制为不同的对象:
Fory fory = Fory.builder().withRefCopy(false).build();
SomeClass a = xxx;
SomeClass copied = fory.copy(a);
内存分配自定义
Fory 提供了 MemoryAllocator 接口,允许你自定义在序列化操作期间如何分配和增长内存缓冲区。这对于性能优化、内存池化或调试内存使用很有用。
MemoryAllocator 接口
MemoryAllocator 接口定义了两个关键方法:
public interface MemoryAllocator {
/**
* 分配具有指定初始容量的新 MemoryBuffer。
*/
MemoryBuffer allocate(int initialCapacity);
/**
* 增长现有缓冲区以容纳新容量。
* 实现必须通过修改现有缓冲区实例来原地增长缓冲区。
*/
MemoryBuffer grow(MemoryBuffer buffer, int newCapacity);
}
使用自定义内存分配器
你可以设置一个全局内存分配器,所有 MemoryBuffer 实例都将使用它:
// 创建自定义分配器
MemoryAllocator customAllocator = new MemoryAllocator() {
@Override
public MemoryBuffer allocate(int initialCapacity) {
// 为调试或池化添加额外容量
return MemoryBuffer.fromByteArray(new byte[initialCapacity + 100]);
}
@Override
public MemoryBuffer grow(MemoryBuffer buffer, int newCapacity) {
if (newCapacity <= buffer.size()) {
return buffer;
}
// 自定义增长策略 - 添加 100% 额外容量
int newSize = (int) (newCapacity * 2);
byte[] data = new byte[newSize];
buffer.copyToUnsafe(0, data, Platform.BYTE_ARRAY_OFFSET, buffer.size());
buffer.initHeapBuffer(data, 0, data.length);
return buffer;
}
};
// 全局设置自定义分配器
MemoryBuffer.setGlobalAllocator(customAllocator);
// 所有后续的 MemoryBuffer 分配都将使用你的自定义分配器
Fory fory = Fory.builder().withLanguage(Language.JAVA).build();
byte[] bytes = fory.serialize(someObject); // 使用自定义分配器