/* * Copyright (c) 2018-2028, DreamLu All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: DreamLu 卢春梦 (596392912@qq.com) */ package org.springblade.core.redis.serializer; import io.protostuff.LinkedBuffer; import io.protostuff.ProtostuffIOUtil; import io.protostuff.Schema; import io.protostuff.runtime.RuntimeSchema; import org.springblade.core.tool.utils.ObjectUtil; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; /** * ProtoStuff 序列化 * * @author L.cm */ public class ProtoStuffSerializer implements RedisSerializer { private final Schema schema; public ProtoStuffSerializer() { this.schema = RuntimeSchema.getSchema(BytesWrapper.class); } @Override public byte[] serialize(Object object) throws SerializationException { if (object == null) { return null; } LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE); try { return ProtostuffIOUtil.toByteArray(new BytesWrapper<>(object), schema, buffer); } finally { buffer.clear(); } } @Override public Object deserialize(byte[] bytes) throws SerializationException { if (ObjectUtil.isEmpty(bytes)) { return null; } BytesWrapper wrapper = new BytesWrapper<>(); ProtostuffIOUtil.mergeFrom(bytes, wrapper, schema); return wrapper.getValue(); } }