一、fst

介绍:FST fast-serialization 是重新实现的 Java 快速对象序列化的开发包
开源地址:https://gitee.com/mirrors/fst
依赖

        <!-- https://mvnrepository.com/artifact/de.ruedigermoeller/fst --><dependency><groupId>de.ruedigermoeller</groupId><artifactId>fst</artifactId><version>2.57</version></dependency>

代码实现

import lombok.Data;
import org.nustaq.serialization.FSTConfiguration;
import org.nustaq.serialization.FSTObjectInput;
import org.nustaq.serialization.FSTObjectOutput;
import org.nustaq.serialization.coders.JSONAsString;import java.io.*;public class StringText {static FSTConfiguration conf = FSTConfiguration.createAndroidDefaultConfiguration();static void writeObject(OutputStream outputStream, FstObject fstObject) throws IOException {FSTObjectOutput out = conf.getObjectOutput(outputStream);out.writeObject(fstObject);out.close();}static FstObject readObject(InputStream inputStream) throws Exception {FSTObjectInput input = conf.getObjectInput(inputStream);FstObject fstObject = (FstObject) input.readObject(FstObject.class);input.close();return fstObject;}@Datapublic static class TS implements Serializable {@JSONAsStringbyte[] bytes;}@Datastatic class PJ implements Serializable {int a = 10;}@Datapublic static class FstObject{private String name;private int age;}// 2种配置 实现不同public static void main(String[] args) throws UnsupportedEncodingException {TS t = new TS();FSTConfiguration conf = FSTConfiguration.createJsonConfiguration(true,false);byte[] bytes = conf.asByteArray(t);System.out.println(new String(bytes,"UTF-8"));FSTConfiguration fst = FSTConfiguration.createJsonConfiguration();PJ pojo = new PJ();String x = fst.asJsonString(pojo);System.out.println(x);FSTConfiguration conks = FSTConfiguration.createAndroidDefaultConfiguration();FstObject object = new FstObject();object.setName("test");object.setAge(30);System.out.println("serialization, " + object);byte[] bytes1 = conks.asByteArray(object);FstObject newObject = (FstObject) conks.asObject(bytes1);System.out.println("deSerialization, " + newObject);}
}

二、kryo

介绍:Kryo是用于Java的快速高效的二进制对象图序列化框架。该项目的目标是高速,小尺寸和易于使用的API。每当需要将对象持久保存到文件,数据库还是通过网络时,该项目都是有用的。
Kryo还可以执行自动的深浅复制/克隆。这是从对象到对象的直接复制,而不是从对象到字节的复制。

开源地址:https://github.com/EsotericSoftware/kryo
依赖

        <!--可能会与业务现有依赖的asm产生冲突--><!-- https://mvnrepository.com/artifact/com.esotericsoftware/kryo --><dependency><groupId>com.esotericsoftware</groupId><artifactId>kryo-shaded</artifactId><version>4.0.2</version></dependency><!-- https://mvnrepository.com/artifact/org.objenesis/objenesis --><!-- 用于实例化Java对象的库 --><dependency><groupId>org.objenesis</groupId><artifactId>objenesis</artifactId><version>3.1</version></dependency>

代码实现

public interface Serializer {/*** 序列化* @param object* @param bytes*/void serializer(Object object,byte[] bytes);/**** @param object* @param bytes* @param offset* @param count*/void serializer(Object object,byte[] bytes,int offset,int count);/*** 反序列化* @param bytes* @param <T>* @return*/<T> T deserializer(byte[] bytes);/*** 反序列化* @param bytes* @param offset* @param count* @param <T>* @return*/<T> T deserializer(byte[] bytes,int offset,int count);
}
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.BeanSerializer;
import org.objenesis.strategy.StdInstantiatorStrategy;
import org.springframework.stereotype.Component;/*** kryo实现序列化和反序列化接口* kryo不是线程安全的,需要注意,使用独立线程实现*/
@Component
public class KryoSerializer implements Serializer {//将kryo对象存储在线程中,只有这个线程可以访问到,这样保证kryo的线程安全性,ThreadLocal(线程内部存储类)//通过get()&set()方法读取线程内的数据private final ThreadLocal<Kryo> kryoThreadLocal = new ThreadLocal<Kryo>(){@Overrideprotected Kryo initialValue() {Kryo kryo = new Kryo();kryo.register(aClass, new BeanSerializer<>(kryo,aClass));//引用,对A对象序列化时,默认情况下kryo会在每个成员对象第一次序列化时写入一个数字,// 该数字逻辑上就代表了对该成员对象的引用,如果后续有引用指向该成员对象,// 则直接序列化之前存入的数字即可,而不需要再次序列化对象本身。// 这种默认策略对于成员存在互相引用的情况较有利,否则就会造成空间浪费// (因为没序列化一个成员对象,都多序列化一个数字),// 通常情况下可以将该策略关闭,kryo.setReferences(false);kryo.setReferences(false);//设置是否注册全限定名,kryo.setRegistrationRequired(false);//设置初始化策略,如果没有默认无参构造器,那么就需要设置此项,使用此策略构造一个无参构造器kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());return kryo;}};private final  ThreadLocal<Output> outputThreadLocal = new ThreadLocal<>();private final  ThreadLocal<Input> inputThreadLocal = new ThreadLocal<>();private Class<?> aClass = null;public Class<?> getaClass() {return aClass;}public void setaClass(Class<?> aClass) {this.aClass = aClass;}@Overridepublic void serializer(Object object, byte[] bytes) {Kryo kryo = kryoThreadLocal.get();Output output =getOutPut(bytes);kryo.writeObjectOrNull(output,object,object.getClass());output.flush();}@Overridepublic void serializer(Object object, byte[] bytes, int offset, int count) {Kryo kryo = kryoThreadLocal.get();Output output =getOutPut(bytes,offset,count);kryo.writeObjectOrNull(output,object,object.getClass());output.flush();}@Overridepublic <T> T deserializer(byte[] bytes) {Kryo kryo =  kryoThreadLocal.get();Input input = getInPut(bytes);return (T)kryo.readObjectOrNull(input,aClass);}@Overridepublic <T> T deserializer(byte[] bytes, int offset, int count){Kryo kryo = kryoThreadLocal.get();Input input = getInPut(bytes,offset,count);return (T)kryo.readObjectOrNull(input,aClass);}private Output getOutPut(byte[] bytes){Output output = outputThreadLocal.get();if(output == null){output = new Output();outputThreadLocal.set(new Output());}if(bytes!=null){output.setBuffer(bytes);}return output;}private Output getOutPut(byte[] bytes,int offset,int count){Output output = outputThreadLocal.get();if(output == null){output = new Output();outputThreadLocal.set(new Output());}if(bytes!=null){output.writeBytes(bytes,offset,count);}return output;}private Input getInPut(byte[] bytes){Input input = inputThreadLocal.get();if(input == null){input= new Input();outputThreadLocal.set(new Output());}if(bytes!=null){input.setBuffer(bytes);}return input;}private Input getInPut(byte[] bytes,int offser,int count){Input input = inputThreadLocal.get();if(input == null){input= new Input();outputThreadLocal.set(new Output());}if(bytes!=null){input.setBuffer(bytes,offser,count);}return input;}
}
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.pool.KryoPool;
import lombok.Data;
import org.objenesis.strategy.StdInstantiatorStrategy;import java.util.Arrays;
import java.util.List;/*** kryo的对象本身不是线程安全的,所以我们有两种选择来保障线程安全。*/
public class KryoTest {private static final ThreadLocal<Kryo> kryoLocal = ThreadLocal.withInitial(() -> {Kryo kryo = new Kryo();kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));return kryo;});public KryoPool newKryoPool() {return new KryoPool.Builder(() -> {final Kryo kryo = new Kryo();kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));return kryo;}).softReferences().build();}public static void main(String[] args) {byte[] bytes =new byte[200];String[] strings = {"s1","s2"};System.out.println(Arrays.toString(bytes));KryoSerializer kryoSerializer = new KryoSerializer();kryoSerializer.setaClass(TestSerialization.class);TestSerialization testSerialization = new TestSerialization();testSerialization.setText("test1");testSerialization.setName("test2");testSerialization.setId(1);testSerialization.setFlag(false);testSerialization.setList(Arrays.asList(strings));kryoSerializer.serializer(testSerialization, bytes);System.out.println(testSerialization.toString());System.out.println(Arrays.toString(bytes));TestSerialization testSerialization1 = kryoSerializer.deserializer(bytes);System.out.println(testSerialization1.toString());System.out.println(Arrays.toString(bytes));}@Datapublic static class TestSerialization {private int id;private String text;private String name;private boolean flag;private List<String> list;}
}

三、请求与响应测试

kryo、fst实现序列化相关推荐

  1. Java kryo/protobuf/protostuff序列化 or Json 性能对比

    Java kryo/protobuf/protostuff序列化 or Json 性能对比 - 腾飞的鹰 - 博客园 对于一个java object的序列化,想测一下使用json和使用一般序列化工具, ...

  2. dubbo中使用kryo进行对象序列化,反序列化时报错

    最近在项目中遇到一个问题,应用部署到tomcat后启动报错,异常的大致意思是反序列话失败.dubbo中开启的序列化方式为kyro,自己对dubbo并不怎么熟悉,迷迷糊糊查了一圈.最后错误原因是因为消费 ...

  3. java fst 入门 例子_Redis 使用 fst 进行序列化

    添加 maven 依赖 de.ruedigermoeller fst 2.57 实现 RedisSerializer 接口 public class FSTSerializer implements ...

  4. Java常用类库以及简介,具体使用细节进行百度(爬虫爬取的数据)

    来至于互联网 Office文档的Java处理包 POI [推荐] Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: ...

  5. jackson、fastjson、kryo、protostuff等序列化工具性能对比

    简介 实际项目中,我们经常需要使用序列化工具来存储和传输对象.目前用得比较多的序列化工具有:jackson.fastjson.kryo.protostuff.fst 等,本文将简单对比这几款工具序列化 ...

  6. 使用Kryo的序列化方式提升Netty性能

    2019独角兽企业重金招聘Python工程师标准>>> 为什么选择Kryo? 首先,Kryo的序列化方式,在性能方面是比较好的,和Protobuf差不多,比Java原生的序列化方式快 ...

  7. 分布式系统开发工具包 —— 基于Kryo的Java对象序列化

    Kryo是用于Java语言的一个快速和高效的对象图序列化框架.Kryo项目的目的是快速.高效.方便地使用API.当需要持久化对象的时候,不论是持久化到文件.数据库还是网络,都可以使用Kryo. 目前K ...

  8. dubbo kryo序列化_为什么如此高效?解密kryo各个数据类型的序列化编码机制,强...

    用过dubbo的开发人员,在替换序列化时都会根据"经验"来选kryo为序列化框架,其原因是序列化协议非常高效,超过java原生序列化协议,hessian2协议,那kryo为什么高效 ...

  9. java protostuff 好处_Java 序列化框架性能对比(kryo、hessian、java、protostuff)

    简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf 需静态编译 Protostuff-Ru ...

最新文章

  1. Ascend Pytorch算子适配层开发
  2. 一周焦点 | 李彦宏:如果谷歌回来,有信心再赢一次;GitHub深度学习开源项目Top200...
  3. golang 标准库strings包 简介
  4. java akka_Akka系列(九):Akka分布式之Akka Remote
  5. java通信方式_java 认知底层的五种通信方式
  6. frame、bounds表示大小和位置的属性以及center、position、anchorPosition
  7. python中怎样划分时间段_如何划分重叠的日期时间间隔(组织模式时钟时间)?...
  8. 迄今以来在硅谷的最大押注:摩根大通雇超千人专注金融科技
  9. linux 打开cgm软件,cgm文件扩展名,cgm文件怎么打开?
  10. 制作游戏辅助/外挂违法吗?
  11. U3D游戏开发框架(三)——UI管理器
  12. Win7不支持此接口的修复方法
  13. GDrive首次现身!
  14. tween.js简介
  15. 押上声誉百亿豪赌,雷军几分胜算?
  16. 这年头能真正掌握Javaassist技术的程序员真不多
  17. 顺序栈(含有栈顶指针,栈底指针)的实现以及编写过程中的一些疑惑的解决
  18. 基于web的商场商城后台管理系统
  19. 迅为i.MX6开发板mqtt 移植教程(一)
  20. 腾讯云申请免费ssl证书(1年有效期)

热门文章

  1. 干货|纳税人须知的纳税信用那些事儿
  2. 带你一文解析RCU锁机制原理
  3. Python中二进制的理解
  4. css sprite-网页优化技术
  5. 一个晚上十点定时关机程序
  6. 面试季,真的太狠了...
  7. 项目部署--我爱起名网平台搭建学习研究(含php源码,亲测有效)
  8. 我的世界java种子 要塞,我的世界:中国版罕见种子,一个遗迹顶你十个,大多数玩家未见过...
  9. 吃鸡手游模拟器服务器维护,绝地求生刺激战场卡在初始界面怎么办 loading解决方法...
  10. Android RecyclerView实现瀑布流布局