java 序列化方案

本贴最后更新于 2663 天前,其中的信息可能已经时移俗易

概述

  • 专门针对 Java 语言的:Kryo,FST 等
  • 跨语言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack 等

kryo

kryo 是一个 java 序列化库。

入门示例

依赖

<dependency> <groupId>com.esotericsoftware</groupId> <artifactId>kryo</artifactId> <version>4.0.1</version> </dependency>

demo 序列化到文件

public static void main(String[] args) throws FileNotFoundException { Kryo kryo = new Kryo(); Output output = new Output(new FileOutputStream("/tmp/output.dat")); Map<String, Object> map = new HashMap<String, Object>(); map.put("a", 1); map.put("b", 2); kryo.writeObject(output, map); output.close(); Input input = new Input(new FileInputStream("/tmp/output.dat")); Map<String, Object> newmap = kryo.readObject(input, HashMap.class); input.close(); System.out.println(newmap); }

demo 序列化到 bytes

public static void main(String[] args) throws IOException { Kryo kryo = new Kryo(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); Output output = new Output(baos); Map<String, Object> map = new HashMap<String, Object>(); map.put("a", 1); map.put("b", 2); kryo.writeObject(output, map); output.close(); baos.flush(); byte[] bytes = baos.toByteArray(); Input input = new Input(new ByteArrayInputStream(bytes)); Map<String, Object> newmap = kryo.readObject(input, HashMap.class); input.close(); System.out.println(newmap); }

fst

依赖

<dependency> <groupId>de.ruedigermoeller</groupId> <artifactId>fst</artifactId> <version>2.57</version> </dependency>

demo 序列化到 bytes

public static void main(String[] args) { FSTConfiguration fst = FSTConfiguration.createDefaultConfiguration(); Map<String, Object> map = new HashMap<String, Object>(); map.put("a", 1); map.put("b", 2); byte[] bytes = fst.asByteArray(map); System.out.println(bytes.length); Map<String, Object> newmap = (Map) fst.asObject(bytes); System.out.println(newmap); }

Protostuff

依赖

<dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.6.0</version> </dependency> <dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.6.0</version> </dependency>

demo 序列化到 bytes

public static class Bean { private String a; private int b; public String getA() { return a; } public int getB() { return b; } public void setA(String a) { this.a = a; } public void setB(int b) { this.b = b; } } public static <T> byte[] serializer(T o) { Schema schema = RuntimeSchema.getSchema(o.getClass()); return ProtobufIOUtil.toByteArray(o, schema, LinkedBuffer.allocate(256)); } public static <T> T deserializer(byte[] bytes, Class<T> clazz) { T obj = null; try { obj = clazz.newInstance(); Schema schema = RuntimeSchema.getSchema(obj.getClass()); ProtostuffIOUtil.mergeFrom(bytes, obj, schema); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return obj; } public static void main(String[] args) { Bean bean = new Bean(); bean.setA("1"); bean.setB(2); byte[] bytes = serializer(bean); System.out.println(bytes.length); Bean newmap = deserializer(bytes, Bean.class); System.out.println(newmap); }

第三方测试结果

fst 是完全兼容 JDK 序列化协议的系列化框架,序列化速度大概是 JDK 的 4-10 倍,大小是 JDK 大小的 1/3 左右。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...