序列化
本页演示了所有支持语言的跨语言序列化模式示例。在一种语言中序列化的数据可以在任何其他支持的语言中反序列化。
序列化内置类型
常见类型可以自动序列化,无需注册:原始数值类型、字符串、二进制、数组、列表、映射等。
Java
import org.apache.fory.*;
import org.apache.fory.config.*;
import java.util.*;
public class Example1 {
public static void main(String[] args) {
Fory fory = Fory.builder().withLanguage(Language.XLANG).build();
List<Object> list = ofArrayList(true, false, "str", -1.1, 1, new int[100], new double[20]);
byte[] bytes = fory.serialize(list);
// bytes 可以被其他语言反序列化
fory.deserialize(bytes);
Map<Object, Object> map = new HashMap<>();
map.put("k1", "v1");
map.put("k2", list);
map.put("k3", -1);
bytes = fory.serialize(map);
// bytes 可以被其他语言反序列化
fory.deserialize(bytes);
}
}
Python
import pyfory
import numpy as np
fory = pyfory.Fory()
object_list = [True, False, "str", -1.1, 1,
np.full(100, 0, dtype=np.int32), np.full(20, 0.0, dtype=np.double)]
data = fory.serialize(object_list)
# bytes 可以被其他语言反序列化
new_list = fory.deserialize(data)
object_map = {"k1": "v1", "k2": object_list, "k3": -1}
data = fory.serialize(object_map)
# bytes 可以被其他语言反序列化
new_map = fory.deserialize(data)
print(new_map)
Go
package main
import forygo "github.com/apache/fory/go/fory"
import "fmt"
func main() {
list := []interface{}{true, false, "str", -1.1, 1, make([]int32, 10), make([]float64, 20)}
fory := forygo.NewFory()
bytes, err := fory.Marshal(list)
if err != nil {
panic(err)
}
var newValue interface{}
// bytes 可以被其他语言反序列化
if err := fory.Unmarshal(bytes, &newValue); err != nil {
panic(err)
}
fmt.Println(newValue)
dict := map[string]interface{}{
"k1": "v1",
"k2": list,
"k3": -1,
}
bytes, err = fory.Marshal(dict)
if err != nil {
panic(err)
}
// bytes 可以被其他语言反序列化
if err := fory.Unmarshal(bytes, &newValue); err != nil {
panic(err)
}
fmt.Println(newValue)
}
JavaScript
import Fory from "@apache-fory/fory";
/**
* @apache-fory/hps 使用 v8 的 fast-calls-api,可以直接被 jit 调用,
* 确保 Node 版本为 20 或更高。
* 实验性功能,目前无法保证安装成功。
* 如果无法安装该模块,请将其替换为 `const hps = null;`
**/
import hps from "@apache-fory/hps";
const fory = new Fory({ hps });
const input = fory.serialize("hello fory");
const result = fory.deserialize(input);
console.log(result);
Rust
use fory::{from_buffer, to_buffer, Fory};
use std::collections::HashMap;
fn run() {
let bin: Vec<u8> = to_buffer(&"hello".to_string());
let obj: String = from_buffer(&bin).expect("should success");
assert_eq!("hello".to_string(), obj);
}