zoukankan      html  css  js  c++  java
  • 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.LinkedBuffer;
    import com.dyuproject.protostuff.ProtostuffIOUtil;
    import com.dyuproject.protostuff.Schema;
    import com.dyuproject.protostuff.runtime.RuntimeSchema;
    
    /**
     * 
     * <pre>
     * 序列号工具
     * </pre>
     *
     * @author F.Fang
     */
    public class ProtoStuffSerializerUtil {
    
        public static <T> byte[] serialize(T obj) {
            if (obj == null) {
                throw new RuntimeException("序列化对象(" + obj + ")!");
            }
            @SuppressWarnings("unchecked")
            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;
        }
    
        public static <T> T deserialize(byte[] paramArrayOfByte, Class<T> targetClass) {
            if (paramArrayOfByte == null || 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;
        }
        
        public static <T> byte[] serializeList(List<T> objList) {
            if (objList == null || objList.isEmpty()) {
                throw new RuntimeException("序列化对象列表(" + objList + ")参数异常!");
            }
            @SuppressWarnings("unchecked")
            Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(objList.get(0).getClass());
            LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);
            byte[] protostuff = null;
            ByteArrayOutputStream bos = null;
            try {
                bos = new ByteArrayOutputStream();
                ProtostuffIOUtil.writeListTo(bos, objList, schema, buffer);
                protostuff = bos.toByteArray();
            } catch (Exception e) {
                throw new RuntimeException("序列化对象列表(" + objList + ")发生异常!", e);
            } finally {
                buffer.clear();
                try {
                    if(bos!=null){
                        bos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
            return protostuff;
        }
        
        public static <T> List<T> deserializeList(byte[] paramArrayOfByte, Class<T> targetClass) {
            if (paramArrayOfByte == null || paramArrayOfByte.length == 0) {
                throw new RuntimeException("反序列化对象发生异常,byte序列为空!");
            }
            
            Schema<T> schema = RuntimeSchema.getSchema(targetClass);
            List<T> result = null;
            try {
                result = ProtostuffIOUtil.parseListFrom(new ByteArrayInputStream(paramArrayOfByte), schema);
            } catch (IOException e) {
                throw new RuntimeException("反序列化对象列表发生异常!",e);
            }
            return result;
        }
    
    }

    测试代码

    public class ProtoStuffSerializerUtilTest {
        
        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 String getName() {
                return name;
            }
            
        }
        
        @Test
        public void demo(){
            Person p = new Person(1,"ff");
            byte[] arr = ProtoStuffSerializerUtil.serialize(p);
            Person result = ProtoStuffSerializerUtil.deserialize(arr, Person.class);
            assertEquals(p.getId(), result.getId());
            assertEquals(p.getName(), result.getName());
        }
    }
    一段旅程,远去所有昨天的昨天,如记事本翻开新的一页,永远的不漏痕迹的把记忆藏在一片洁白中。然后绚烂的开始新的故事。
  • 相关阅读:
    C#.NET中现在用的SqlHelper操作方法集合【收藏版】
    SQLHelper.cs的经典代码收集
    ASP.NET数据格式的Format DataFormatString
    asp.net操作 httpcookie
    项目开发中我所用到的SQL收集
    GridView的dataformatstring设置
    jQuery事件处理: 别再乱用“return false”了
    非常不错的空白占位符“    ”
    Hello World
    VSFlexGrid 控件属性方法一览
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/5485132.html
Copyright © 2011-2022 走看看