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序列化接口封装的更多相关文章

  1. Protostuff序列化分析

    前言最近项目中需要将业务对象直接序列化,然后存数据库:考虑到序列化.反序列化的时间以及生产文件的大小觉得Protobuf是一个很好的选择,但是Protobuf有的问题就是需要有一个.proto的描述文 ...

  2. Protostuff序列化问题

    最近在开发中遇到一个Protostuff序列化问题,在这记录一下问题的根源:分析一下Protostuff序列化和反序列化原理:以及怎么样避免改bug. 1. 问题描述 有一个push业务用到了mq,m ...

  3. java:Session(概述,三层架构实例(实现接口封装JDBC),Session实现简单购物车实例)

    1.Session概述: Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存 ...

  4. Java微信公众平台接口封装源码分享

    前言:      这篇博客是在三月初动手项目的时候准备写的,但是为了完成项目只好拖延时间写这篇博客,顺便也可以在项目中应用我自己总结的的一些经验.今天看来,这些方法的应用还是可以的,至少实现了我之前的 ...

  5. Hibernate的实体类为什么要实现Serializable序列化接口?

    Hibernate的实体类中为什么要继承Serializable?   hibernate有二级缓存,缓存会将对象写进硬盘,就必须序列化,以及兼容对象在网络中的传输 等等. java中常见的几个类(如 ...

  6. C++ Redis mset 二进制数据接口封装方案

    C++ Redis mset 二进制数据接口封装方案 需求 C++中使用hiredis客户端接口访问redis: 需要使用mset一次设置多个二进制数据 以下给出三种封装实现方案: 简单拼接方案 在r ...

  7. android ipc通信机制之二序列化接口和Binder

    IPC的一些基本概念,Serializable接口,Parcelable接口,以及Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelab ...

  8. Java序列化接口的作用总结

    一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了. ...

  9. webservice asmx 无法序列化接口 System.Collections.Generic.IList

    转载自:http://www.cnblogs.com/chenhuzi/p/4178194.html 今天有位同事在方法里加了一个IList<entity> 的返回值,也没有测试,直接发布 ...

  10. hiredis异步接口封装并导出到Lua

    hiredis异步接口封装并导出到Lua(金庆的专栏 2017.1)hiredis 不支持 Windows, Windows 下使用 wasppdotorg / hiredis-for-windows ...

随机推荐

  1. Kafka Stream 以及其他流处理框架对比

    1. Kafka Stream Introduction 假设我们需要对kafka 消息做流数据分析,例如: 对部分消息做过滤 每分钟计算一次收到了多少消息 这种情况下,对于消息过滤以及定时统计,甚至 ...

  2. FSCTF 2023(公开赛道)WP

    FSCTF 2023 ID:Mar10 Rank:6 总结:下次看到不正常报错一定重新安装一遍工具~~ web 源码!启动! 就在源码注释里 <!-- 师傅们,欢迎来到CTF的世界~ NSSCT ...

  3. 数据存储为json或数据库

    1.数据存储 In [ ]: import requests from bs4 import BeautifulSoup rqq = requests.get('http://www.tipdm.co ...

  4. Day 9 - 线段树

    线段树 引入 线段树是算法竞赛中常用的用来维护 区间信息 的数据结构. 线段树可以在 \(O(\log N)\) 的时间复杂度内实现单点修改.区间修改.区间查询(区间求和,求区间最大值,求区间最小值) ...

  5. 阅读翻译Mathematics for Machine Learning之2.5 Linear Independence

    阅读翻译Mathematics for Machine Learning之2.5 Linear Independence 关于: 首次发表日期:2024-07-18 Mathematics for M ...

  6. 在Django REST framework (DRF) 中,`request.query_params` 和 `request.data` 区别

    在Django REST framework (DRF) 中,request.query_params 和 request.data 都是用来获取请求中的数据,但是它们之间有一些关键的区别: requ ...

  7. 【ActiveJdbc】05

    一.事务 通常在 Java ORM 中有一个显式连接或管理器对象(JPA 中的 EntityManager,Hibernate 中的 SessionManager 等). ActiveJDBC 中没有 ...

  8. Typora配置自动上传图片到图床

      在多平台发布文章时,如果遇到图片不能导入的问题,推荐使用图床!推荐使用阿里云或腾讯云,免费的不用考虑了! PicGo下载 链接:https://pan.quark.cn/s/2ec95402631 ...

  9. 人形机器人 —— Figure 01机器人亮相 | OpenAI多模态能力加持 | 与人类流畅对话交互 | 具身智能的GPT-4时刻

    视频地址: https://www.youtube.com/watch?v=vO1wnHA0tZg Figure AI 公司主页: https://www.figure.ai/ 根据Figure 01 ...

  10. ubuntu 服务器显示 计算显卡的剩余 显存空间 并执行计划任务

    在Ubuntu服务器上需要运行gpu计算任务,由于需要无人值守的在显存空间满足条件的时候运行程序,于是有了自动显示显存的程序及自动运行任务的程序: 自动显示显存: import os import r ...