protostuff序列化接口封装
1.pom
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version>
</dependency>
2.代码
package cn.piesat.tool.util;
import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtobufIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author xxx
* @version V1.0
* @data 2018年5月08日 下午1:26:48
* @Description 使用protostuff 序列化和反序列化的工具类
*/
public class SerializeUtil {
private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>();
private static <T> Schema<T> getSchema(Class<T> clazz) {
@SuppressWarnings("unchecked")
Schema<T> schema = (Schema<T>) cachedSchema.get(clazz);
if (schema == null) {
schema = RuntimeSchema.createFrom(clazz);
if (schema != null) {
cachedSchema.put(clazz, schema);
}
}
return schema;
}
/**
* 将对象通过protostuff的方式进行序列化得到byte[]
*
* @param t 要序列化的对象
* @param <T>
* @return
*/
public static <T> byte[] serializer(T t) {
Class<T> clazz = (Class<T>) t.getClass();
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
try {
Schema<T> schema = getSchema(clazz);
return ProtobufIOUtil.toByteArray(t, schema, buffer);
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
} finally {
buffer.clear();
}
}
/**
* 将通过protostuff的方式序列化的byte[] 进行反序列化成实体对象
*
* @param data protostuff的方式序列化的byte[]数据
* @param clazz 要进行反序列化成实体的Class
* @param <T>
* @return
*/
public static <T> T deserializer(byte[] data, Class<T> clazz) {
try {
Schema<T> schema = getSchema(clazz);
T t = schema.newMessage();
ProtobufIOUtil.mergeFrom(data, t, schema);
return t;
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
/**
* 序列化Map结构数据
* @param map
*
* @param <V>
* @return
*/
public static <K, V> byte[] serializerMap(Map<K, V> map) {
if (map == null) {
return null;
}
MapDto mapDto = new MapDto(map);
return serializer(mapDto);
}
/**
* 反序列化Map
*
* @param data
* @param <V>
* @return
*/
public static <K, V> Map<K, V> deserializerMap(byte[] data) {
if (data == null || data.length == 0) {
return null;
}
MapDto mapDto = deserializer(data, MapDto.class);
if (mapDto != null) {
return (Map<K, V>) mapDto.getMap();
}
return null;
}
/**
* 序列化List结构数据
*
* @param list
* @param <V>
* @return
*/
public static <V> byte[] serializerList(List<V> list) {
if (list == null) {
return null;
}
ListDto listDto = new ListDto(list);
return serializer(listDto);
}
/**
* 反序列化List
*
* @param data
* @param <V>
* @return
*/
public static <V> List<V> deserializerList(byte[] data) {
if (data == null || data.length == 0) {
return null;
}
ListDto listDto = deserializer(data, ListDto.class);
if (listDto != null) {
return (List<V>) listDto.getList();
}
return null;
}
/**
* Map的包装类
*/
public static class MapDto {
private Map<?, ?> map;
public MapDto(Map<?, ?> map) {
this.map = map;
}
public Map<?, ?> getMap() {
return map;
}
public void setMap(Map<?, ?> map) {
this.map = map;
}
}
/**
* List的包装类
*/
public static class ListDto {
private List<?> list;
public ListDto(List<?> list) {
this.list = list;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
}
}
public static class ObjectDto {
private Object obj;
public ObjectDto(Object obj) {
this.obj = obj;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
}
protostuff序列化接口封装的更多相关文章
- Protostuff序列化分析
前言最近项目中需要将业务对象直接序列化,然后存数据库:考虑到序列化.反序列化的时间以及生产文件的大小觉得Protobuf是一个很好的选择,但是Protobuf有的问题就是需要有一个.proto的描述文 ...
- Protostuff序列化问题
最近在开发中遇到一个Protostuff序列化问题,在这记录一下问题的根源:分析一下Protostuff序列化和反序列化原理:以及怎么样避免改bug. 1. 问题描述 有一个push业务用到了mq,m ...
- java:Session(概述,三层架构实例(实现接口封装JDBC),Session实现简单购物车实例)
1.Session概述: Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存 ...
- Java微信公众平台接口封装源码分享
前言: 这篇博客是在三月初动手项目的时候准备写的,但是为了完成项目只好拖延时间写这篇博客,顺便也可以在项目中应用我自己总结的的一些经验.今天看来,这些方法的应用还是可以的,至少实现了我之前的 ...
- Hibernate的实体类为什么要实现Serializable序列化接口?
Hibernate的实体类中为什么要继承Serializable? hibernate有二级缓存,缓存会将对象写进硬盘,就必须序列化,以及兼容对象在网络中的传输 等等. java中常见的几个类(如 ...
- C++ Redis mset 二进制数据接口封装方案
C++ Redis mset 二进制数据接口封装方案 需求 C++中使用hiredis客户端接口访问redis: 需要使用mset一次设置多个二进制数据 以下给出三种封装实现方案: 简单拼接方案 在r ...
- android ipc通信机制之二序列化接口和Binder
IPC的一些基本概念,Serializable接口,Parcelable接口,以及Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelab ...
- Java序列化接口的作用总结
一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了. ...
- webservice asmx 无法序列化接口 System.Collections.Generic.IList
转载自:http://www.cnblogs.com/chenhuzi/p/4178194.html 今天有位同事在方法里加了一个IList<entity> 的返回值,也没有测试,直接发布 ...
- hiredis异步接口封装并导出到Lua
hiredis异步接口封装并导出到Lua(金庆的专栏 2017.1)hiredis 不支持 Windows, Windows 下使用 wasppdotorg / hiredis-for-windows ...
随机推荐
- 下载 Linux 内核的脚本
介绍 在 类UNIX 环境下运行比较好(基于wget) 包括了 2.6 ~ 4.x 内核的地址. 5.x 因为 还在更新因此不做记录. 脚本下载地址: https://files.cnblogs.co ...
- 设备树DTS 学习: 4-uboot 传递 dtb 给 内核
背景 得到 dtb 文件以后,我们需要想办法下载到 板子中,并给 Linux 内核使用. (高级版本的 uboot也有了 自己使用设备树支持,我们这里不讨论 uboot 使用的设备树) Linux 内 ...
- 记一次RocketMQ消费非顺序消息引起的线上事故
应用场景 C端用户提交工单.工单创建完成之后.会发布一条工单创建完成的消息事件(异步消息).MQ消费者收到消息之后.会通知各处理器处理该消息.各处理器处理完后都会发布一条将该工单写入搜索引擎的消息.最 ...
- 【经验分享】Docker容器部署方法说明
前 言 本案例适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit Linux开发环境:Ubuntu 18.04.4 64bit 虚拟机:VMwa ...
- 【价格全面下调】一片含税79元,双核A7@1.2GHz,-40℃~85℃真工业级!
自9个月前,创龙科技全志T113-i核心板(SOM-TLT113)推出之后,受到广大工业用户的高度关注,且超过300家企业已选用创龙科技T113-i核心板用于终端产品开发. 为了让更多用户轻松选择T1 ...
- Spark3 学习【基于Java】4. Spark-Sql数据源
通过DF,Spark可以跟大量各型的数据源(文件/数据库/大数据)进行交互.前面我们已经看到DF可以生成视图,这就是一个非常使用的功能. 简单的读写流程如下: 通过read方法拿到DataFrameR ...
- Bom浏览器对象模型 -- 手稿
------------恢复内容开始------------ ------------恢复内容结束------------ ------------恢复内容开始------------ ------- ...
- Claude是否超过Chatgpt,成为生成式AI的一哥?
Anthropic 周一推出了 Claude 3 ,据这家初创公司称,该系列中最有能力的 Claude 3 Opus 在各种基准测试中都优于 Openai 的竞争对手 GPT-4 和谷歌的 Gemin ...
- ASP.NET Core 程序集注入(二)
public void ConfigureServices(IServiceCollection services) { string strValue = Configuration.GetSect ...
- 题解:P10608 双人游戏
题解:P10608 双人游戏 题意 给予你一个长度为 \(n\) 的字符串 \(c\),\(c\) 上有三种颜色的棋子,其中有 \(m\) 个空字符. 接下来有 \(m\) 个操作,每个操作意味小 M ...