Java Protostuff 序列化工具类

JAVA序列化--Protobuf Protocol Buffers(简称protobuf)是一种轻便高效的数据序列化格式,可用于结构化数据的序列化和反序列化。它由Google开发并开源,用于解决数据交换和存储的通用问题。 阅读详情

1. 引入maven依赖

    

<dependency>
   <groupId>io.protostuff</groupId>
   <artifactId>protostuff-core</artifactId>
   <version>1.5.9</version>
</dependency>

<dependency>
   <groupId>io.protostuff</groupId>
   <artifactId>protostuff-runtime</artifactId>
   <version>1.5.9</version>
</dependency>

2. 工具类

    

package com.daily.dailytest.protostuff;

import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * <p> Date             :2018/4/12 </p>
 * <p> Module           : </p>
 * <p> Description      : </p>
 * <p> Remark           : </p>
 *
 * @author yangdejun
 * @version 1.0
 * <p>--------------------------------------------------------------</p>
 * <p>修改历史</p>
 * <p>    序号    日期    修改人    修改原因    </p>
 * <p>    1                                     </p>
 */
public class ProtoStuffSerializerUtil {

    private ProtoStuffSerializerUtil() {
    }

    /**
     * 序列化单个对象
     * @param obj
     * @param <T>
     * @return
     */
    public static <T> byte[] serialize(T obj){
        if (null == obj) {
            throw new RuntimeException("序列化对象不能为空:" + obj);
        }
        Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(obj.getClass());
        LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);
        byte[] protostuff = null;
        try {
            protostuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
        } catch (Exception e) {
            throw new RuntimeException("序列化->" + obj.getClass() + "对象" + obj + "发生异常", e);
        } finally {
            buffer.clear();
        }
        return protostuff;
    }

    /**
     * 反序列化单个对象
     * @param paramArrayOfByte
     * @param targetClass
     * @param <T>
     * @return
     */
    public static <T> T deserialize(byte[] paramArrayOfByte, Class<T> targetClass) {
        if (null == paramArrayOfByte || paramArrayOfByte.length == 0) {
            throw new RuntimeException("反序列化对象发生异常,byte序列为空");
        }
        T instance = null;
        try {
            instance = targetClass.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException("反序列化过程中一句类型创建对象失败", e);
        }
        Schema<T> schema = RuntimeSchema.getSchema(targetClass);
        ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema);
        return instance;
    }

    /**
     * 序列化对象集合(List)
     * @param objList
     * @param <T>
     * @return
     */
    public static <T> byte[] serializeList(List<T> objList) {
        if (null == objList || objList.isEmpty()) {
            throw new RuntimeException("序列化对象列表" + objList + "参数异常");
        }
        Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(objList.get(0).getClass());
        LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);
        byte[] protostuff = null;
        try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
            ProtostuffIOUtil.writeListTo(bos, objList, schema, buffer);
            protostuff = bos.toByteArray();
        } catch (Exception e) {
            throw new RuntimeException("序列化对象列表" + objList + "发生异常", e);
        } finally {
            buffer.clear();
        }
        return protostuff;
    }

    /**
     * 反序列化对象集合(List)
     * @param <T>
     * @param paramArrayOfByte
     * @param targetClass
     * @return
     */
    public static <T> List<T> deserializeList(byte[] paramArrayOfByte, Class<ProtostuffTest.Person> targetClass) {
        if (null == paramArrayOfByte || paramArrayOfByte.length == 0) {
            throw new RuntimeException("反序列化对象发生异常,byte序列为空");
        }
        Schema<T> schema = RuntimeSchema.getSchema((Class<T>) targetClass);
        List<T> result = null;
        try {
            result = ProtostuffIOUtil.parseListFrom(new ByteArrayInputStream(paramArrayOfByte), schema);
        } catch (IOException e) {
            throw new RuntimeException("反序列化对象列表发生异常", e);
        }
        return result;
    }

}
3. 测试序列化工具类

        
package com.daily.dailytest.protostuff;

import java.util.ArrayList;
import java.util.List;

/**
 * <p> Date             :2018/4/12 </p>
 * <p> Module           : </p>
 * <p> Description      : </p>
 * <p> Remark           : </p>
 *
 * @author yangdejun
 * @version 1.0
 * <p>--------------------------------------------------------------</p>
 * <p>修改历史</p>
 * <p>    序号    日期    修改人    修改原因    </p>
 * <p>    1                                     </p>
 */
public class ProtostuffTest {

    public static class Person {

        int id;

        String name;

        public Person() {
        }

        public Person(int id, String name) {
            this.id = id;
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    public static void main(String[] args) {
        Person p1 = new Person(124443423, "ajkldfjklajdkfjklajdklfjakljdkfl");
        Person p2 = new Person(124443423, "ajkldfjklajdkfjklajdklfjakljdkfl");
        //单个序列化
        byte[] arr = ProtoStuffSerializerUtil.serialize(p1);
        //单个反序列化
        Person result = ProtoStuffSerializerUtil.deserialize(arr, Person.class);

        //对象集合序列化
        List<Person> personList = new ArrayList<>();
        personList.add(p1);
        personList.add(p2);
        byte[] bytes = ProtoStuffSerializerUtil.serializeList(personList);

        //对象集合反序列化
        List<Person> persons = ProtoStuffSerializerUtil.deserializeList(bytes, Person.class);
    }
}
AI大模型学习(13)小白也能学会的10分钟豆包大模型的python教程1 豆包AI大模型API是字节跳动推出的智能对话接口服务,开发者可以通过简单的HTTP请求调用强大的AI能力,实现智能问答、内容生成等功能。 阅读详情

相关推荐

小米汽车技术路线

从小米的电子电器架构来看,行业内EEA已经由域集中逐渐过度到域融合+区域控制的架构并向着中央计算+区域控制的方向发展。 而小米汽车智驾算法也从基于高精地图模块化架构,到去高精地图模块化架构,再到端到端架构,这也正是行业对于智驾算法演进的共识。

HITbingdu的博客 3785

Protostuff 序列化工具类

Protostuff 简介 Protostuff是一个序列化库,支持一下序列化格式: protobuf protostuff(本地) graph json smile xml yaml kvp pom.xml 文件添加protostuff 序列化包依赖 <!--引入protostuff依赖--> <dependency> ...

zhouzhiwengang的专栏 1586

手把手教你用Zynq-7100 FPGA实现100Mbps OOK信号定时同步(含完整Verilog代码)

本文详细介绍了如何在Zynq-7100 FPGA平台上实现100Mbps OOK信号的定时同步,涵盖插值算法、Gardner定时误差检测等关键技术。通过完整的Verilog代码和优化技巧,解决了50MHz外部时钟条件下的400MHz采样率同步挑战,为无线通信系统设计提供实用解决方案。

weixin_42522374的博客 301

java序列化机制之protoStuff

之前曾经写了两篇java的序列的机制,一种是默认的java序列化机制,这种方式效率太低。另外一种是谷歌的protobuf,但是这种我们还要写proto文件,并且我们还要使用工具来编译生成java文件,实在太麻烦。但是protostuff却不一样,能够很好的解决上面两者的问题。这篇文章就研究一下如何去使用,并对其进行一个简单的分析。 一、认识protostuff 其实protostuff也是有局...

zhangmiaoping23的专栏 1256

全志DRM框架下LVDS双屏异显配置实战

本文详细介绍了在全志DRM框架下配置LVDS双屏异显的实战经验。涵盖硬件连接、内核配置、设备树修改、背光控制及U-Boot适配等关键步骤,重点解析屏参转换技巧与双屏route配置,帮助开发者解决工业控制台等多屏应用中的显示适配问题,提升开发效率。

rnn9storyteller的博客 813

利用按键精灵实现批量截图与智能命名的高效工作流

本文详细介绍了如何利用按键精灵软件构建高效的批量截图与智能命名自动化工作流。通过基础脚本编写、循环逻辑实现及高级命名策略,解决手动操作耗时易错的问题,帮助用户实现一键自动截图、智能保存与文件重命名,大幅提升软件测试、教程制作及数据报告等场景的工作效率。

weixin_29268267的博客 569

【java学习】序列化与反序列化:Json框架、xml转换、msgpack;java序列化

1,概念 1)JavaBean JavaBean不是一个编程规则,也不是语法规范,它是一个习惯性的编程规范。在fastJson中,解析用到的实体类必须严格按照JavaBean规范来写。 特点: ①类为public ②有一个无参数的构造方法。 ③属性为私有,通过getXxx()和setXxx方法设置属性(方法的第四个字母为大写)。 ④必须实现序列号接口。 2)JSONObje............

午后阳光 3800

ANSYS 12.1避坑全记录:当Win7+VMware14遇到FLEXlm报错时的自救指南

本文详细介绍了在Windows 7和VMware14环境下安装和运行ANSYS 12.1时遇到的FLEXlm报错问题及其解决方案。通过虚拟机技术隔离时间同步问题,提供从环境配置到许可证管理的完整指南,帮助用户稳定运行这一老旧版本的工程仿真软件。

tt34567的博客 644

ProtoStuff 序列化例子

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; import com.dyuproject.protostuff.LinkedBuffer; import com.dyuproje...

bug_yun的博客 251

YOLO11改进 | 注意力机制 | 添加SimAM注意力机制【全网独家+附完整代码】

yolo11,yolo11改进,yolo11创新,yolo11添加注意力机制

kay_545 1230

QGIS编译(跨平台编译)001:Flex、Bison编译(安装)(Windows、Linux、MacOS环境下安装)

QGIS编译;Flex、Bison编译(安装)(Windows、Linux、MacOS环境下安装)

LuckyHanMo的博客 3080

Protostuff 序列化工具类详解:高性能Java对象序列化方案

本文介绍了一个基于Protostuff的高性能Java序列化工具类实现。该工具类采用Schema缓存机制(ConcurrentHashMap)提升性能,默认512字节缓冲区优化空间占用,并通过泛型设计保证类型安全。相比Java原生序列化,Protostuff具有更好的性能和更小的空间占用,支持大多数Java常用类型,使用简单无需额外配置。文章详细解析了工具类的核心设计要点,包括异常处理、日志记录等,并提供了使用示例和性能优化建议。该实现具有线程安全、高性能等特点,适用于RPC调用、消息传输等分布式系统开发场

qq_33651286的博客 431

外骨骼机器人(五):步态分析之正常步态

研究病理步态之前,需要了解正常步态,作为判断标准。但是需要记住两个问题:1.“正常”因人而异,性别、年龄、身体情况都需要考虑在内,因此,需要对不同的个体选择合适的正常标准;2.即使病人的步态与正常步态有某种不同,这也不能说明这是不可取的,也不能说明应该把它变成“正常”步态。许多步态异常是对病人的一些问题的一种补偿,尽管异常,但它们仍然是有用的。步态周期的定义是连续为两次发生重复行走事件之间的时间间隔。尽管可以选择任何事件来定义步态周期,但通常使用一只脚接触地面的瞬间(“初始接触”)是方便的。

行者无疆的博客 1995

protostuff序列化方式学习

本文看下protostuff序列化机制。

wang0907的博客 624

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Spring 技术特性】采用 protostuff 和 kryo 高性能序列化框架实现 RestTemplate 的序列化组件

*** 序列化对象* @return*/try {/*** 反序列化对象* @return*/T instance;try {/*** 序列化列表* @return*/try {try {if (bos!= null) {/*** 反序列化列表* @return*/try {不修改 RedisSerializer 组件和重写操作直接自定义 RedisClient 工具类方式,代理 RedisTemplate 的工具类方法@Autowired/*** @return*//*** @return*/});

2301_82242014的博客 598

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

protostuff序列化工具类

导入依赖: ​ <!-- Protostuff --> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.0.8</version>

大家都叫我菜鸡刘 576

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Protostuff序列化工具类

源代码 package org.wit.ff.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; import com.dyuproject.protostuff.LinkedB

z69183787的专栏 3994

protostuff java_Protostuff一键序列化工具、Protobuf JAVA实现

前言:由于搜集网络,发现Protostuff相关内容较少,故此发布这篇文章1.何为序列化序列化(Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊...

weixin_39646084的博客 480

netty之Protostuff序列化协议

netty之Protostuff序列化协议详细讲解

zwjzone的博客 982

序列化 protostuff

package com.cmall.redis.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util...

xiaomin1991222的专栏 130

Protostuff序列化和反序列化使用说明

原文:http://blog.youkuaiyun.com/zhglance/article/details/56017926   google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.Java文件,鄙人试了一次,发现真的很麻烦。而protostuff的官方网站(http://www.protostuff.io/documentation...

weixin_34336292的博客 97

protostuff简单应用

     protobuf是谷歌推出的与语言无关、平台无关的通信协议,一个对象经过protobuf序列化后将变成二进制格式的数据,所以他可读性差,但换来的是占用空间小,速度快。居网友测试,它的序列化效率是xml的10倍以上。protostuff是java的实现版本。   protostuff在项目中的使用: maven依赖: <dependency> ...

weixin_34292924的博客 105

protostuff高效的编码和解码

Netty提供了很多编解码器,比如编解码字符串的StringEncoder和StringDecoder,编解码对象的ObjectEncoder和ObjectDecoder等。 如果要实现高效的编解码可以用protobuf,但是protobuf需要维护大量的proto文件比较麻烦,现在一般可以使用protostuff。 protostuff是一个基于protobuf实现的序列化方法,它较于protobuf最明显的好处是,在几乎不损耗性能的情况下做到了不用我们写.proto文件来实现序列化。使用它也非常简单

weixin_42446078的博客 494

RedisUtil工具类封装

Redis有很多数据结构:string、hash、list、set等,但是在实际来发中,我们往往保存的是对象在redis中,所以键值对更加常用。 Redis在保存对象时,需要满足序列化,由于java的原生序列化方式效率较低,故更加常用的是Protostuff这个序列化框架。 一、封装Protostuff工具类 import java.util.Map; import java.ut...

文盲青年的博客 2905

通过protostuff实现动态proto

junit junit 3.8.1 test com.google.protobuf protobuf-java 2.6.1 jar com.dyuproject.protostuff protostuff-core 1.0.9 com.dyuproject.protostuff proto

heters的专栏 494

Redis序列化及反序列化应用

Redis序列化及反序列化 需要引入的jar包: protostuff-api-1.1.3.jar protostuff-collectionschema-1.1.3.jar protostuff-core-1.1.3.jar protostuff-runtime-1.1.3.jar 1、java对象序列化工具 import java.io.Serializable; /** ...

喵叻嗰咪的博客 441
上一篇: Centos 7 安装rabbitmq
下一篇: Linux 简介
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值