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


= None@dataclassclass SomeClass1: f1: Any f2: Dict[pyfury.Int8Type pyfury.Int32Type
if __name__ == \"__main__\": fury_ = pyfury.Fury(reference_tracking=False) fury_.register_class(SomeClass1 \"example.SomeClass1\") fury_.register_class(SomeClass2 \"example.SomeClass2\") obj2 = SomeClass2(f1=True f2={-1: 2) obj1 = SomeClass1( f1=obj2 f2=\"abc\" f3=[\"abc\" \"abc\"
f4={1: 2 f5=2 ** 7 - 1 f6=2 ** 15 - 1 f7=2 ** 31 - 1 f8=2 ** 63 - 1 f9=1.0 / 2 f10=1 / 3.0 f11=array.array(\"h\" [1 2
) f12=[-1 4
) data = https://mparticle.uc.cn/api/fury_.serialize(obj) # bytes can be data serialized by other languages. print(fury_.deserialize(data)) GoLang序列化示例
package mainimport \"code.alipay.com/ray-project/fury/go/fury\"import \"fmt\"func main() { type SomeClass1 struct { F1 interface{ F2 string F3 [
interface{ F4 map[int8
int32 F5 int8 F6 int16 F7 int32 F8 int64 F9 float32 F10 float64 F11 [
int16 F12 fury.Int16Slicetype SomeClas2 struct { F1 interface{ F2 map[int8
int32fury_ := fury.NewFury(false) if err := fury_.RegisterTagType(\"example.SomeClass1\" SomeClass1{); err != nil { panic(err)if err := fury_.RegisterTagType(\"example.SomeClass2\" SomeClass2{); err != nil { panic(err)obj2 :=SomeClass2{ obj2.F1 = true obj2.F2 = map[int8
int32{-1: 2 obj :=SomeClass1{ obj.F1 = obj2 obj.F2 = \"abc\" obj.F3 = [
interface{{\"abc\" \"abc\" f4 := map[int8
int32{1: 2 obj.F4 = f4 obj.F5 = fury.MaxInt8 obj.F6 = fury.MaxInt16 obj.F7 = fury.MaxInt32 obj.F8 = fury.MaxInt64 obj.F9 = 1.0 / 2 obj.F10 = 1 / 3.0 obj.F11 = [
int16{1 2 obj.F12 = [
int16{-1 4 bytes err := fury_.Marshal(value) if err != nil {var newValue interface{ // bytes can be data serialized by other languages. if err := fury_.Unmarshal(bytesnewValue); err != nil { panic(err)fmt.Println(newValue) 序列化共享循环引用
共享引用和循环引用是程序里面常见的构造 , 很多数据结构如图都包含大量的循环引用 , 而手动实现这些包含共享引用和循环引用的对象 , 需要大量冗长复杂易出错的代码 。 跨语言序列化框架支持循环引用可以极大简化这些复杂场景的序列化 , 加速业务迭代效率 。 下面是一个包含循环引用的自定义类型跨语言序列化示例 。
Java序列化示例
import com.google.common.collect.ImmutableMap;import io.fury.*;import java.util.Map;public class ReferenceExample { public static class SomeClass { SomeClass f1; MapString Stringf2; MapString Stringf3;public static Object createObject() { SomeClass obj = new SomeClass(); obj.f1 = obj; obj.f2 = ImmutableMap.of(\"k1\" \"v1\" \"k2\" \"v2\"); obj.f3 = obj.f2; return obj;Java序列化:
public class ReferenceExample { // mvn exec:java -Dexec.mainClass=\"io.fury.examples.ReferenceExample\" public static void main(String[
args) { // Fury应该在多个对象序列化之间复用 , 不要每次创建新的Fury实例 Fury fury = Fury.builder().withLanguage(Language.JAVA) .withReferenceTracking(true) .withClassRegistrationRequired(false) .build(); byte[
bytes = fury.serialize(createObject()); System.out.println(fury.deserialize(bytes));;跨语言序列化:
public class ReferenceExample { // mvn exec:java -Dexec.mainClass=\"io.fury.examples.ReferenceExample\" public static void main(String[
args) { // Fury应该在多个对象序列化之间复用 , 不要每次创建新的Fury实例 Fury fury = Fury.builder().withLanguage(Language.XLANG) .withReferenceTracking(true).build(); fury.register(SomeClass.class \"example.SomeClass\"); byte[
bytes = fury.serialize(createObject()); // bytes can be data serialized by other languages. System.out.println(fury.deserialize(bytes));;Python序列化示例
from typing import Dictimport pyfuryclass SomeClass: f1: \"SomeClass\" f2: Dict[str str
f3: Dict[str str
if __name__ == \"__main__\": fury_ = pyfury.Fury(reference_tracking=True) fury_.register_class(SomeClass \"example.SomeClass\") obj = SomeClass() obj.f2 = {\"k1\": \"v1\" \"k2\": \"v2\" obj.f1 obj.f3 = obj obj.f2 data = https://mparticle.uc.cn/api/fury_.serialize(obj) # bytes can be data serialized by other languages. print(fury_.deserialize(data)) Golang序列化示例