Java序列化之ProtoStuff
知识点:
- ProtoStuff 是将结构数据转为字节流进行序列化的,优点是占用空间小,速度快,缺点是可读性差。
- 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;
    }
参考:
Java序列化之ProtoStuff的更多相关文章
- [java]序列化框架性能对比(kryo、hessian、java、protostuff)
		序列化框架性能对比(kryo.hessian.java.protostuff) 简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Pro ... 
- Java序列化技术与Protobuff
		http://www.cnblogs.com/fangfan/p/4094175.html http://www.cnblogs.com/fangfan/p/4094175.html 前言: Java ... 
- Java序列化框架性能比較
		博客: http://colobu.com jvm-serializers提供了一个非常好的比較各种Java序列化的的測试套件. 它罗列了各种序列化框架. 能够自己主动生成測试报告. 我在AWS c3 ... 
- 浅析若干Java序列化工具【转】
		在Java中socket传输数据时,数据类型往往比较难选择.可能要考虑带宽.跨语言.版本的兼容等问题.比较常见的做法有: 采用java对象的序列化和反序列化 把对象包装成JSON字符串传输 Googl ... 
- 在Dubbo中使用高效的Java序列化(Kryo和FST)
		在Dubbo中使用高效的Java序列化(Kryo和FST) 作者:沈理 文档版权:Creative Commons 3.0许可证 署名-禁止演绎 完善中…… TODO 生成可点击的目录 目录 序列化漫 ... 
- (记录)Jedis存放对象和读取对象--Java序列化与反序列化
		一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ... 
- Java 序列化与反序列化
		1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ... 
- Java序列化与反序列化
		Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ... 
- java序列化
		什么是java序列化,如何实现java序列化? 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机 ... 
- Java 序列化Serializable详解
		Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ... 
随机推荐
- deepin国产操作系统 nvidia-docker2 的安装
			====================================== 平时偶尔使用deepin系统,突然有个 nvidia-docker 的程序需要运行,平时工作都是在用Ubuntu,所以对d ... 
- .NET电子邮件高效处理解决方案
			前言 在日常软件开发中,电子邮件处理是一个不可或缺的功能,无论是用户注册验证.通知推送还是日常的业务沟通,都离不开电子邮件的支持.今天大姚给大家分享2款.NET开源.高效.强大的.NET电子邮件处理库 ... 
- 快速基于 ClickHouse + Grafana 搭建可观测性解决方案 - 分布式链路追踪篇(ClickHouse 官方博客)
			引言 在 ClickHouse,我们认为可观测性仅仅是另一个实时分析问题.作为一款高性能的实时分析数据库,ClickHouse 被用于多种场景,包括时间序列数据的实时分析.其应用场景的多样性推动了大量 ... 
- Leetcode: 586. Customer Placing the Largest Number of Orders
			题目要求如下: 给出的例子如下: 简单地说就是要找出表中订单最多客户的ID. 使用如下的代码进行实现: import pandas as pd def largest_orders(orders: p ... 
- python调用第三方java包实例
			先看结果: 对于python与java的互调,我一开始是用的py4j,但是后来发现在使用方法的时候,不知道如何在python中导入jar包,然后网上的资料也比较少.后来想不出来办法,又看到有Jpype ... 
- Linux下如何在程序中获取某个命令执行的结果?【附源码】
			在工作中遇到一个问题,就是想获取某个函数执行之后打印的字符串信息. 这个功能应用场景挺多的, 特地整理了一下相关知识点分享给大家. 1. 使用临时文件 1) 使用shell的重定向 将命令输出重定向到 ... 
- WPF 模拟UWP原生窗口样式——亚克力|云母材质、自定义标题栏样式、原生DWM动画 (附我封装好的类)
			先看一下最终效果,左图为使用亚克力材质并添加组合颜色的效果:右图为MicaAlt材质的效果.两者都自定义了标题栏并且最大限度地保留了DWM提供的原生窗口效果(最大化最小化.关闭出现的动画.窗口阴影.拖 ... 
- 后缀数组--SA--字符串
			SA (Suffix Array) -- 后缀数组 简介 这里明白两个定义: \(SA_i\) : 按字典序排列后大小为 \(i\) 的后缀的后缀头的下标. \(Rank_i\) : 后缀头的下标为 ... 
- 记一次 .NET某实验室自动进样系统 崩溃分析
			一:背景 1. 讲故事 前些天有位朋友在微信上联系到我,说他们的程序在客户那边崩掉了,让我帮忙看下怎么回事,dump也拿到了,那就上手分析吧. 二:WinDbg 分析 1. 哪里的崩溃 既然是程序的崩 ... 
- chezmoi 使用
			chezmoi(发音 /ʃeɪ mwa/ (shay-moi)):在多台不同的机器上安全地管理你的 dotfiles. 安装 macOS: brew install chezmoi Ubuntu: s ... 
