知识点:

  1. ProtoStuff 是将结构数据转为字节流进行序列化的,优点是占用空间小,速度快,缺点是可读性差。
  2. ProtoStuff 是基于 ProtoBuf 发展而来的。

本文不讲那么多背景,直接上代码:

import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException; public class ProtostuffRedisSerializer implements RedisSerializer<Object> {
private static final Schema<ObjectWrapper> SCHEMA = RuntimeSchema.getSchema(ObjectWrapper.class); @Override
public byte[] serialize(Object o) throws SerializationException {
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
byte[] bytes;
try {
bytes = ProtostuffIOUtil.toByteArray(new ObjectWrapper(o), SCHEMA, buffer);
} finally {
buffer.clear();
}
return bytes;
} @Override
public Object deserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
return null;
}
ObjectWrapper wrapper = new ObjectWrapper();
ProtostuffIOUtil.mergeFrom(bytes, wrapper, SCHEMA);
return wrapper.getObject();
} @Override
public boolean canSerialize(Class<?> type) {
return false;
} @Override
public Class<?> getTargetType() {
return null;
} public static class ObjectWrapper {
private Object object; public ObjectWrapper() {
} public ObjectWrapper(Object object) {
this.object = object;
} public Object getObject() {
return object;
} public void setObject(Object object) {
this.object = object;
}
}
}

在RedisTemplate上使用:

    private static final String PROTOSTUFF_REDIS_TEMPLATE = "protostuffRedisTemplate";

    @Bean(name = PROTOSTUFF_REDIS_TEMPLATE)
public RedisTemplate<String, Object> protostuffRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
template.setKeySerializer(redisSerializer);
template.setHashKeySerializer(redisSerializer); ProtostuffRedisSerializer protostuffRedisSerializer = new ProtostuffRedisSerializer();
template.setValueSerializer(protostuffRedisSerializer);
template.setHashValueSerializer(protostuffRedisSerializer); template.afterPropertiesSet();
return template;
}

参考:

  1. java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子
  2. Protobuf vs. Protostuff:性能、易用性和适用场景分析

Java序列化之ProtoStuff的更多相关文章

  1. [java]序列化框架性能对比(kryo、hessian、java、protostuff)

    序列化框架性能对比(kryo.hessian.java.protostuff) 简介:   优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Pro ...

  2. Java序列化技术与Protobuff

    http://www.cnblogs.com/fangfan/p/4094175.html http://www.cnblogs.com/fangfan/p/4094175.html 前言: Java ...

  3. Java序列化框架性能比較

    博客: http://colobu.com jvm-serializers提供了一个非常好的比較各种Java序列化的的測试套件. 它罗列了各种序列化框架. 能够自己主动生成測试报告. 我在AWS c3 ...

  4. 浅析若干Java序列化工具【转】

    在Java中socket传输数据时,数据类型往往比较难选择.可能要考虑带宽.跨语言.版本的兼容等问题.比较常见的做法有: 采用java对象的序列化和反序列化 把对象包装成JSON字符串传输 Googl ...

  5. 在Dubbo中使用高效的Java序列化(Kryo和FST)

    在Dubbo中使用高效的Java序列化(Kryo和FST) 作者:沈理 文档版权:Creative Commons 3.0许可证 署名-禁止演绎 完善中…… TODO 生成可点击的目录 目录 序列化漫 ...

  6. (记录)Jedis存放对象和读取对象--Java序列化与反序列化

    一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...

  7. Java 序列化与反序列化

    1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ...

  8. Java序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  9. java序列化

    什么是java序列化,如何实现java序列化? 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机 ...

  10. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

随机推荐

  1. Ubuntu18.04 环境下 解决VScode中空格长度减小的问题

       问题:   Ubuntu下安装vscode后发现空格特别小,只有正常空格的一半大小 ======================================================= ...

  2. pytorch的显存释放机制torch.cuda.empty_cache()

    参考: https://cloud.tencent.com/developer/article/1626387 据说在pytorch中使用torch.cuda.empty_cache()可以释放缓存空 ...

  3. P2P下载为什么不流行了——在线视频与P2P下载的一些比较

    平时习惯性发呆,这两天发呆想到了这么一个问题,那就是"P2P下载为什么不流行了--在线视频与P2P下载的比较".想到这个问题其实还是与自己的一些个人经历有关,在14年前读大学的时候 ...

  4. Tomcat的配置文件中有哪些关键的配置项,它们分别有什么作用?

    Tomcat的配置文件主要包括server.xml和web.xml,它们位于Tomcat安装目录下的conf文件夹中.今天的内容重点介绍 server.xml 文件的配置,V 哥会结合一些业务场景来介 ...

  5. 安装nvm,并通过nvm安装nodejs

    转载请注明出处: 1.安装nvm 打开终端,然后运行以下命令来下载并安装nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39 ...

  6. Linux/macOS 查看网络接口

    Linux 显示网络设备的状态: $ nmcli device status DEVICE TYPE STATE CONNECTION enp0s5 ethernet connected Wired ...

  7. 安装 Google Cloud CLI(gcloud)

    安装 Ubuntu # 更新软件包索引 sudo apt update # 安装辅助工具 sudo apt install apt-transport-https ca-certificates gn ...

  8. MDC – Text field

    前言 Angular Material 只有 Form field, 但 Material Design 有份 Text field 和 Form field, Form field 是给 check ...

  9. Vscode 远程切换Python虚拟环境

    在VSCode中远程切换Python虚拟环境是一个涉及多个步骤的过程,包括安装必要的扩展.连接到远程服务器.创建或激活虚拟环境,并在VSCode中选择相应的Python解释器.以下是一个详细的步骤指南 ...

  10. skywalking/8.5部署

    制作镜像 OAP镜像 # cat oap/Dockerfile FROM apache/skywalking-oap-server:8.5.0-es7 # 时区修改为东八区 RUN apk add - ...