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 ...
随机推荐
- 「转」Android编译选项中的eng、user、user-debug
Android编译选项中eng.user.user-debug主要区别 reference: https://blog.csdn.net/dearsq/article/details/52589376 ...
- V4L2视频采集操作流程和接口说明
背景: V4L2是V4L的升级版本,为linux下视频设备程序提供了一套接口规范.包括一套数据结构和底层V4L2驱动接口. <WAV文件格式分析> 一般操作流程(视频设备): 1.打开设备 ...
- 深度解读昇腾CANN多流并行技术,提高硬件资源利用率
本文分享自华为云社区<深度解读昇腾CANN多流并行技术,提高硬件资源利用率>,作者:昇腾CANN. 随着人工智能应用日益成熟,文本.图片.音频.视频等非结构化数据的处理需求呈指数级增长,数 ...
- 嵌入式入门必看!调试工具安装——基于 AM64x核心板
本章节内容是为评估板串口安装USB转串口驱动程序.驱动适用于CH340.CH341等USB转串口芯片. USB转串口驱动安装 适用安装环境:Windows 7 64bit.Windows 10 64b ...
- 搭建hadoop集群关键步骤--以三节点为例
搭建三节点的hadoop集群: 要求: 主机名称 备注 IP地址 功能 hadoop01 Master 主节点 192.168.211.134 NameNode.DataNode.ResourceMa ...
- MAPREDUCE中的序列化
Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系....),不便于在网络中高效传输: 所以,hadoo ...
- Linux-Cgroup V2 初体验
本文主要记录 Linux Cgroup V2 版本基本使用操作,包括 cpu.memory 子系统演示. 1. 开启 Cgroup V2 版本检查 通过下面这条命令来查看当前系统使用的 Cgroups ...
- SQL Server 锁(LOCK)大全
一.锁(LOCK)知识及应用 1.1 锁的基础知识 在任何多用户的数据库中,必须有一套用于数据修改的一致的规则.对于真正的事务处理型数据库,当两个不同的进程试图同时修改同一份数据时,数据库管理系统(D ...
- SUM-ACM,3月24-3-31周报
两场天梯赛和一场atcoder. 主要错误知识点在于字符串的处理和并查集的掌握不够,不懂灵活运用. 第一场pta天梯赛 7-5 6翻了 一道字符串的题,我只拿了14分.我不熟悉一个点,f(i,0,s. ...
- 那些血淋淋的教训——math
1. 方程的解要写 x= 2023.12.10 晚上周测填空题第 \(2\) 题,方程的解写成了 \(7\) 而不是 \(x=7\). 2. 分类讨论 选填的最后一题. 3. 去绝对值看清楚符号(某个 ...