C轮融资|Fury:一个基于JIT动态编译的高性能多语言原生序列化框架( 二 )


无缝替代JDK/Kryo/Hessian等Java序列化框架 , 无需修改任何代码 , 同时提供相比Kryo 20倍以上的性能 , 相比Hessian100倍以上的性能 , 相比JDK自带序列化200倍以上的性能 , 可以大幅提升高性能场景RPC调用和对象持久化效率; 支持共享引用和循环引用的Golang序列化框架; 支持对象自动序列化的Golang序列化框架;
目前Fury已经支持Java、Python、Golang以及C++ 。 本文将首先简单介绍如何使用Fury , 然后将Fury跟别的序列化框架进行功能、性能和易用性比较 , Fury的实现原理将在后续文章里面详细介绍 。
如何使用Fury 这里给出跨语言序列化、纯Java序列化以及避免序列化的示例:
跨语言序列化自定义类型 跨语言序列化包含循环引用的自定义类型 跨语言零拷贝序列化 Drop-in替代Kryo/Hession/JDK序列化 通过Fury Format避免序列化 序列化自定义类型
下面是序列化用户自定义类型的一个示例 , 该类型里面包含多个基本类型以及嵌套类型的字段 , 在业务应用里面相当常见 。 需要注意自定义类型跨语言序列化之前需要调用registerAPI注册自定义类型 , 建立类型在不同语言之间的映射关系 , 同时保证GoLang等静态语言编译器编译代码时不裁剪掉这部分类型的符号 。
Java序列化示例
import com.google.common.collect.*;import io.fury.*;import java.util.*;public class CustomObjectExample { public static class SomeClass1 { Object f1; MapByte Integerf2;public static class SomeClass2 { Object f1; String f2; ListObjectf3; MapByte Integerf4; Byte f5; Short f6; Integer f7; Long f8; Float f9; Double f10; short[
f11; ListShortf12;public static Object createObject() { SomeClass1 obj1 = new SomeClass1(); obj1.f1 = true; obj1.f2 = ImmutableMap.of((byte) -1 2); SomeClass2 obj = new SomeClass2(); obj.f1 = obj1; obj.f2 = \"abc\"; obj.f3 = Arrays.asList(\"abc\" \"abc\"); obj.f4 = ImmutableMap.of((byte) 1 2); obj.f5 = Byte.MAX_VALUE; obj.f6 = Short.MAX_VALUE; obj.f7 = Integer.MAX_VALUE; obj.f8 = Long.MAX_VALUE; obj.f9 = 1.0f / 2; obj.f10 = 1 / 3.0; obj.f11 = new short[
{(short) 1 (short) 2; obj.f12 = ImmutableList.of((short) -1 (short) 4); return obj;纯Java序列化:
public class CustomObjectExample { // mvn exec:java -Dexec.mainClass=\"io.fury.examples.CustomObjectExample\" public static void main(String[
args) { // Fury应该在多个对象序列化之间复用 , 不要每次创建新的Fury实例 Fury fury = Fury.builder().withLanguage(Language.JAVA) .withReferenceTracking(false) .withClassRegistrationRequired(false) .build(); byte[
bytes = fury.serialize(createObject()); System.out.println(fury.deserialize(bytes));;跨语言序列化:
public class CustomObjectExample { // mvn exec:java -Dexec.mainClass=\"io.fury.examples.CustomObjectExample\" public static void main(String[
args) { // Fury应该在多个对象序列化之间复用 , 不要每次创建新的Fury实例 Fury fury = Fury.builder().withLanguage(Language.XLANG) .withReferenceTracking(false).build(); fury.register(SomeClass1.class \"example.SomeClass1\"); fury.register(SomeClass2.class \"example.SomeClass2\"); byte[
bytes = fury.serialize(createObject()); // bytes can be data serialized by other languages. System.out.println(fury.deserialize(bytes));;Python序列化示例
from dataclasses import dataclassfrom typing import List Dictimport pyfury@dataclassclass SomeClass2: f1: Any = None f2: str = None f3: List[str
= None f4: Dict[pyfury.Int8Type pyfury.Int32Type
= None f5: pyfury.Int8Type = None f6: pyfury.Int16Type = None f7: pyfury.Int32Type = None # int类型默认会按照long类型进行序列化 , 如果对端是更加narrow的类型 ,# 需要使用pyfury.Int32Type等进行标注 f8: int = None # 也可以使用pyfury.Int64Type进行标注 f9: pyfury.Float32Type = None f10: float = None # 也可以使用pyfury.Float64Type进行标注 f11: pyfury.Int16ArrayType = None f12: List[pyfury.Int16Type