ProtostuffUtil—快速序列化和反序列化对象工具

原创 2017年01月04日 01:35:29
package cn.btkj.utils;

import java.util.ArrayList;
import java.util.List;
 
import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
/*
 项目中http通信离不开对象的序列化和反序列化,以前框架使用的是xml,通用、可读性强,
对于对速度要求不高的系统来说,的确是一种不错的选择。然而最近的一个需求需要使用protobuf,因为其速度比xml快非常多,
而业界说到java的序列化和反序列化,更离不开基于protobuf的protostuff
*/

public class ProtostuffUtil {
    
    public static List<byte[]> serializeProtoStuffObjectList(List list,Class clazz) {
        if(list == null  ||  list.size() <= 0) {
            return null;
        }
 
        long start = System.currentTimeMillis() ;
        List<byte[]> bytes = new ArrayList<byte[]>();
        Schema  schema = RuntimeSchema.getSchema(clazz);
        LinkedBuffer buffer = LinkedBuffer.allocate(4096);
        byte[] protostuff = null;
        for(Object p : list) {
            try {
                protostuff = ProtostuffIOUtil.toByteArray(p, schema, buffer);
                bytes.add(protostuff);
            } finally {
                buffer.clear();
            }
        }
        long end = System.currentTimeMillis() ;
        System.out.println("usetime is"+(end - start));
        return bytes;
    }
    
     public static List  deserializeProtoStuffDataListToObjectList(
                List<byte[]> bytesList,Class clazz) {
            if(bytesList == null || bytesList.size() <= 0) {
                return null;
            }
            long start = System.currentTimeMillis() ;
            Schema  schema = RuntimeSchema.getSchema(clazz);
            List<Object> list = new ArrayList<Object>();
            for(byte[] bs : bytesList) {
                Object obj = null;
                try {
                    obj = clazz.newInstance();
                } catch (InstantiationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                ProtostuffIOUtil.mergeFrom(bs,obj, schema);
                list.add(obj);
            }
            long end = System.currentTimeMillis() ;
            System.out.println("usetime is"+(end - start));
            return list;
        }
    
    
        public static  byte[]  serializeProtoStuffObject(Object obj,Class clazz) {
            if(obj == null) {
                return null;
            }
            long start = System.currentTimeMillis() ;
            Schema  schema = RuntimeSchema.getSchema(clazz);
            LinkedBuffer buffer = LinkedBuffer.allocate(4096);
            byte[] protostuff = null;
            protostuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
            long end = System.currentTimeMillis() ;
            System.out.println("usetime is"+(end - start));
            return protostuff;
        }
        
        
         public static Object  deserializeProtoStuffDataListToProductsObject(
                     byte[]  bytes,Class clazz) {
             if(bytes == null) {
                    return null;
                }
                long start = System.currentTimeMillis() ;
                Schema  schema = RuntimeSchema.getSchema(clazz);
    
                Object obj = null;
                try {
                    obj = clazz.newInstance();
                } catch (InstantiationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            
                ProtostuffIOUtil.mergeFrom(bytes,obj, schema);
                long end = System.currentTimeMillis() ;
                System.out.println("usetime is"+(end - start));
                return obj;
            }

}



 


用到的maven依赖:

        <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>


相关文章推荐

Protostuff序列化工具类

源代码 package org.wit.ff.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputSt...

protostuff序列化工具类

package org.wit.ff.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream;...

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

google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件,鄙人试了一次,发现真的很麻烦。而protostuff的官方网站(...

Java 中对象的序列化技术(zz一篇java序列化的好文,强烈推荐)

1、含义:将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。2、编程要求:只有实现Serializable接口的类对象才可以被序列化。 Serializable接口没有定义任何成员,它只...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Protostuff序列化

这几天在看rpc框架的东西,一哥们写的轻量级rpc框架(http://my.oschina.net/huangyong/blog/361751?fromerr=NpC3phqY)实现,写的rpc很不错...

《从零开始搭建游戏服务器》 序列化工具(最优版Protostuff)

前言:之前使用protobuf工具来解析表格数据和定制网络协议,但是为了网络安全和压缩数据大小,有时候需要对数据进行序列化,这就需要设计一个序列化工具类来完成序列化和反序列化的操作。...

protostuff 序列化 list 不一致问题

在编写阿里中间件rpc题目代码时,序列化对象用到了ProtoStuff,出现了一个bug,解决方案:这是protostuff的一个bug,更换版本不起作用,换用了Kryo。 问题:对对象A序列化,A中...

浅析若干Java序列化工具

在java中socket传输数据时,数据类型往往比较难选择。可能要考虑带宽、跨语言、版本的兼容等问题。比较常见的做法有: 采用java对象的序列化和反序列化 把对象包装成JSON字符串传输 Googl...

Java 序列化与反序列化工具类

在基于网络编程的项目中,经常会遇到需要将某些参数进行序列化之后再进行传输,在接收方再进行反序列化操作。普遍的做法是让实体类实现Serializable接口,但是当涉及很多实体类或者说需要序列化的实体类...
  • thjnemo
  • thjnemo
  • 2014年12月08日 15:55
  • 2777
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ProtostuffUtil—快速序列化和反序列化对象工具
举报原因:
原因补充:

(最多只允许输入30个字)