首页 > 其他分享 >Protostuff对象序列化工具

Protostuff对象序列化工具

时间:2023-04-28 11:05:06浏览次数:42  
标签:Protostuff return VO public Schema 工具 序列化 final schema


VO.java

import java.io.Serializable;

/**
 * [概 要] java对象序列化工具<br/>
 * [环 境] J2SE 1.7
 * @author 研发部-ly
 * @version 1.0
 */
public class VO<T> implements Serializable {
    private T value;
    public VO(T value) {
        this.value = value;
    }
    public VO() {
    }
    public T getValue() {
        return value;
    }
    @Override
    public String toString() {
        return "VO{" +
                "value=" + value +
                '}';
    }
}

 

 

ProtostuffSerializer.java

import java.util.concurrent.ConcurrentHashMap;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;

/**
 * [概 要] protostuff对象序列化工具<br/>
 * [环 境] J2SE 1.7
 * @author 研发部-ly
 * @version 1.0
 */
public class ProtostuffSerializer {
    private static ConcurrentHashMap<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>();
    public <T> byte[] serialize(final T source) {
        VO<T> vo = new VO<T>(source);
        final LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
        try {
            final Schema<VO> schema = getSchema(VO.class);
            return serializeInternal(vo, schema, buffer);
        } catch (final Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        } finally {
            buffer.clear();
        }
    }
    public <T> T deserialize(final byte[] bytes) {
        try {
            Schema<VO> schema = getSchema(VO.class);
            VO vo = deserializeInternal(bytes, schema.newMessage(), schema);
            if (vo != null && vo.getValue() != null) {
                return (T) vo.getValue();
            }
        } catch (final Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
        return null;
    }
    private <T> byte[] serializeInternal(final T source, final Schema<T> schema, final LinkedBuffer buffer) {
        return ProtostuffIOUtil.toByteArray(source, schema, buffer);
    }
    private <T> T deserializeInternal(final byte[] bytes, final T result, final Schema<T> schema) {
        ProtostuffIOUtil.mergeFrom(bytes, result, schema);
        return result;
    }
    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);
            cachedSchema.put(clazz, schema);
        }
        return schema;
    }
}

 

 

测试:

 

/**
     * 
     * [概 要] 序列化对象
     * 
     * @param object 要序列化的对象
     * @return byte[] 对象序列化后的字节信息
     */
    private byte[] serialize(Object object) {
        
        ProtostuffSerializer protostuffSerializer = new ProtostuffSerializer();
        byte[] result=protostuffSerializer.serialize(object);
        
        return result;
    }
    
    /**
     * 
     * [概 要] 反序列化
     * @param bytes 对象的字节信息
     * @return Object 反序列化的对象
     */
    public static Object unserialize(byte[] bytes) {
        
        ProtostuffSerializer protostuffSerializer = new ProtostuffSerializer();
        Object object=protostuffSerializer.deserialize(bytes);
        
        return object;
    }

 

 

标签:Protostuff,return,VO,public,Schema,工具,序列化,final,schema
From: https://blog.51cto.com/u_16091571/6233573

相关文章

  • 高性能序列化、反序列化protostuff 使用
    1、引用jar包:pom.xml:<!--protostuff--><dependency><groupId>com.dyuproject.protostuff</groupId><artifactId>protostuff-core</artifactId><version>1.0.7</version>......
  • Jmeter:图形界面压力测试工具
    Jmeter是一款强大的图形界面压力测试工具,完全用Java写成,关于Jmeter的介绍,网上其实有不少的文章,我原本是不想再重复写类似文章的,但我发现有些很关键性的,在我们测试中一定会用到的一些设置或操作很少见到有文章写清楚的,比如有这样的一个常见问题:如何对一个网站的多个链接进行压力测试......
  • 【远程连接工具】xshell上用vi/vim小键盘无法使用的修改办法
    转至:https://blog.csdn.net/qq_44676946/article/details/117257410问题:后台开发人员经常使用Xshell来访问远程服务器,在用vim(或vi)编辑文件的时,使用小键盘数字键的时候,可能会输入一堆字母和换行,并不是数字。修改:1.修改会话属性2.选择类别“终端”-VT模式3.选择“初始数字键盘......
  • 面试官:说说你对序列化的理解
    关注“Java后端技术全栈”回复“000”获取大量电子书本文主要内容背景在Java语言中,程序运行的时候,会产生很多对象,而对象信息也只是在程序运行的时候才在内存中保持其状态,一旦程序停止,内存释放,对象也就不存在了。怎么能让对象永久的保存下来呢?--------对象序列化。何为序列化和反序......
  • Scrum看板工具Leangoo轻量级协作使用场景
    ​国内目前有很多看板工具,我也一直在探索的路上,试用多种工具下来,我个人还是比较推荐leangoo领歌,看板式的管理方式,列表、泳道的多维度,直观透明的特点来呈现敏捷团队的进展,促进团队高效协作。通过看板共享和实时同步团队工作以实现高效协同,团队工作体现为任务卡片,而卡片上的内容......
  • 【0基础学爬虫】爬虫基础之自动化工具 Playwright 的使用
    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为自动化工具playwright的使用。概述......
  • 【Dotnet 工具箱】JIEJIE.NET - 强大的 .NET 代码混淆工具
    你好,这里是Dotnet工具箱,定期分享Dotnet有趣,实用的工具和组件,希望对您有用!JIEJIE.NET-强大的.NET代码混淆工具JIEJIE.NETJIEJIE.NET是一个使用C#开发的开源.NET代码加密工具。很多.NET开发人员担心他们的软件被破解,版权受到侵犯,所以他们使用一些工具来混淆IL......
  • Fastjson反序列化漏洞
    Fastjson反序列化漏洞目录Fastjson反序列化漏洞一、Fastjson介绍1、什么是fastjson?2、fastjson的优点二、影响范围:三、漏洞原理四、漏洞利用五、漏洞发现六、漏洞修复一、Fastjson介绍1、什么是fastjson?fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Ja......
  • c# winform 辅助测试工具,方便记录错误信息,方便查看调试错误,用INI存储,可脱离数据库...
    测试的时候做的一个辅助测试工具在找到了bug的时候可以方便的记录下出错的页面,出错方式,错误信息和解决办法错误信息都保存到一个ini文件下,可通过软件查看更加直观当然了,因时间仓促做的并不完美,源码提供下载,有兴趣的可自行修改,当然改完了也给我看看更好......
  • go语言实现登录注册收藏相关工具和教程链接
    文章目录1、Go语言教程2、Go语言项目3、Gin+gorm学习1、Go语言教程菜鸟教程:https://www.runoob.com/go/go-tutorial.htmlgo-by-example练习:https://github.com/wangkechun/go-by-example2、Go语言项目GoFoundAPI:https://github.com/newpanjing/gofound/blob/main/docs/api.mdGole......