无缝替代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
- 百度|“萝卜快跑”无人车出车祸 后轮被撞掉!官方回应:后车追尾
- 作为国内高新技术企业、两轮绿色能源网络布局的先行者|易马达重磅推出新国标智能换电车
- 百度|百度“萝卜快跑”无人车出车祸 后轮被撞掉
- 天使轮|36氪独家 | 天使轮红杉、云九、StarVC、高瓴同投,「光线云」再获前海基金Pre-A轮投资,全球首款云原生实时渲染引擎
- 3D打印|成立1年完成3轮融资,这家中国食品3D打印公司,为什么这么吃香?
- 阿斯麦尔|风水轮流转!ASML就我国发声,外媒:可以用EUV光刻机换
- 童文红|李楠这下放心了?怒喵科技获千万融资:投资方为联想创投
- 折叠屏|新一轮名单出炉,华为Harmony OS 3.0尝鲜版,新增17款设备可搭载
- 百度|派学车融资、YY学车倒闭,互联网驾培旱涝两重天
- 本文转自:人民网-湖南频道滑移装载机后轮悬空。|湖南长沙:聚焦工程机械 擦亮“智造之城”名片