java序列化之protobuf

package com.book.core.test;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import com.book.core.model.Type;
import com.book.core.serializable.SerializationUtil;
import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtobufIOUtil;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;

/**
 * ProtoStuff测试
 * @author liweihan
 *
 */
public class TestProtoStuff {
	public static void main(String[] args) throws Exception {

		/**
		 * *********** 测试1 : 原始的序列化对象 ************
		 */
		//序列化
		System.out.println(" ========= 序列化开始:" );
		Schema<Type> schema = RuntimeSchema.getSchema(Type.class);
		Type type = new Type();
		type.setCityId(1);
		type.setPrice(new BigDecimal(100));
		type.setTypeName("韩超");

		LinkedBuffer buffer = LinkedBuffer.allocate(1024);
		byte[] data = ProtobufIOUtil.toByteArray(type, schema, buffer);
		System.out.println("序列化后的大小:" + data.length + " 字节 !");

		//反序列化
		System.out.println(" ========= 反序列化开始:" );
		Type type2 = new Type();
		ProtobufIOUtil.mergeFrom(data, type2, schema);
		System.out.println(" ====== 反序列化后的结果为:cityId:" + type2.getCityId() 
				+ " ,typeName:" + type2.getTypeName() 
				+ " , price:" + type2.getPrice());

		/**
		 * ************ 测试2 :单独序列化集合 **************
		 */
		Type t1 = new Type();
		t1.setId(1);
		t1.setCityId(1);
		t1.setPrice(new BigDecimal(1));
		t1.setTypeName("TestHan");

		List<Type> list1 = new ArrayList<Type>();
		list1.add(t1);
		list1.add(type);

		System.out.println(" *********** 序列化开始: ");
		List<byte[]> result = serializeProtoStuffTypeList(list1);
		System.out.println("序列化后集合的大小:" + result.size());

		System.out.println(" *********** 反序列化开始: ");
		List<Type> l = deserializeProtoStuffToTypeList(result);
		System.out.println(" 反序列化后的集合大小为:" + l.size() + " , name1:" + l.get(0).getTypeName());

		/*********** 测试 3 *****************/
		Type type1 = new Type();
		type1.setCityId(2);
		type1.setPrice(new BigDecimal(100));
		type1.setTypeName("太");

		System.out.println(" ------ 序列化开始:");
		byte[] type1Ser = SerializationUtil.object2Bytes_obj(type1);
		System.out.println(" ------- 序列化后的大小:" + type1Ser.length);

		System.out.println(" ------ 反序列化开始:");
		Type type1Result = (Type)SerializationUtil.bytes2Object(type1Ser);
		System.out.println(" ====== 反序列化后的结果为:cityId:" + type1Result.getCityId() 
				+ " ,typeName:" + type1Result.getTypeName() 
				+ " , price:" + type1Result.getPrice());

		/******************** 测试4 :序列化集合 **********************/
		Type t2 = new Type();
		t2.setId(2);
		t2.setCityId(2);
		t2.setPrice(new BigDecimal(23));
		t2.setTypeName("ZHANG");

		ArrayList<Type> list2 = new ArrayList<Type>();
		list2.add(t2);
		list2.add(t1);

		System.out.println(" ++++++++++++++   序列化开始: ");
		byte[] result2 =  SerializationUtil.object2Bytes(list2);
		System.out.println(" 序列化的大小: " + result2.length);

		System.out.println(" ++++++++++++++   序列化结束: ");
		List<Type> listResult = (List<Type>)SerializationUtil.bytes2Object(result2);
		for (Type t: listResult) {
			System.out.println(t.getTypeName());
		}
	}

	/**
	 * 序列化Type的List集合
	 * @param tList
	 * @return
	 */
	public static List<byte[]> serializeProtoStuffTypeList(List<Type> tList) {
		if (tList == null || tList.size() <= 0) {
			return null;
		}

		List<byte[]> bytes = new ArrayList<byte[]>();
		Schema<Type> schema = RuntimeSchema.getSchema(Type.class);
		LinkedBuffer buffer = LinkedBuffer.allocate(1024);
		byte[] protostuff = null;
		for(Type t: tList) {
			try {
				protostuff = ProtostuffIOUtil.toByteArray(t, schema, buffer);
				bytes.add(protostuff);
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				buffer.clear();
			}
		}

		return bytes;
	}

	/**
	 * 反序列化Type的List集合
	 * @param bytesList
	 * @return
	 */
	public static List<Type> deserializeProtoStuffToTypeList(List<byte[]> bytesList) {
		if (bytesList == null || bytesList.size() <= 0) {
			return null;
		}

		Schema<Type> schema = RuntimeSchema.getSchema(Type.class);
		List<Type> list = new ArrayList<Type>();
		for (byte[] bs : bytesList) {
			Type type = new Type();
			ProtostuffIOUtil.mergeFrom(bs, type, schema);
			list.add(type);
		}
		return list;
	}
}
package com.book.core.serializable;

import java.io.Serializable;

public class SerializationUtil {

    public static ProtostuffSerializer protostuffSerializer;

	static {
		protostuffSerializer = new ProtostuffSerializer();
	}

	public static byte[] object2Bytes(Serializable obj) throws Exception {
		if (obj == null) {
			return null;
		}

		return protostuffSerializer.serialize(obj);

/*		ByteArrayOutputStream bo = new ByteArrayOutputStream();
		ObjectOutputStream oo = new ObjectOutputStream(bo);
		oo.writeObject(obj);
		bo.close();
		oo.close();
		return bo.toByteArray();*/
	}

	/**
	 * 序列化【序列化对象不需要实现Serializable】
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public static byte[] object2Bytes_obj(Object obj) throws Exception {
		if (obj == null) {
			return null;
		}

		return protostuffSerializer.serialize(obj);
	}

	public static byte[][] objects2Bytes(Serializable[] obj) throws Exception {
		if (obj == null) {
			return null;
		}
		byte[][] many = new byte[obj.length][];
		for(int i=0;i<obj.length;i++){
			many[i] = object2Bytes(obj[i]);
		}
		return many;
	}

	public static Object bytes2Object(byte[] objBytes) throws Exception {
		if (objBytes == null || objBytes.length == 0) {
			return null;
		}
		Object obj = protostuffSerializer.deserialize(objBytes);
		return obj;

		/*ByteArrayInputStream bi = new ByteArrayInputStream(objBytes);
		ObjectInputStream oi = new ObjectInputStream(bi);
		obj = oi.readObject();
		bi.close();
		oi.close();
		return obj;*/
	}

}
package com.book.core.serializable;

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

import java.util.concurrent.ConcurrentHashMap;

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

}
package com.book.core.serializable;

import java.io.Serializable;

/**
 * Created by yijunzhang on 14-4-2.
 */
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 +
                ‘}‘;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof VO)) return false;
        VO vo = (VO) o;
        if (value != null ? !value.equals(vo.value) : vo.value != null) return false;
        return true;
    }

    @Override
    public int hashCode() {
        return value != null ? value.hashCode() : 0;
    }
}
package com.book.core.model;

import java.math.BigDecimal;

public class Type {
    private Integer id;

    private String typeName;

    private BigDecimal price;

    private Integer cityId;

    public Integer getId() {
        return id;
    }

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

    public String getTypeName() {
        return typeName;
    }

    public void setTypeName(String typeName) {
        this.typeName = typeName == null ? null : typeName.trim();
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public Integer getCityId() {
        return cityId;
    }

    public void setCityId(Integer cityId) {
        this.cityId = cityId;
    }
}
			<dependency>
			  <groupId>com.dyuproject.protostuff</groupId>
			  <artifactId>protostuff-core</artifactId>
			  <version>${protostuff.version}</version>
			</dependency>
			<dependency>
			  <groupId>com.dyuproject.protostuff</groupId>
			  <artifactId>protostuff-runtime</artifactId>
			  <version>${protostuff.version}</version>
			</dependency>
			<dependency>
			  <groupId>com.dyuproject.protostuff</groupId>
			  <artifactId>protostuff-api</artifactId>
			  <version>${protostuff.version}</version>
			</dependency>
			<dependency>
			  <groupId>com.dyuproject.protostuff</groupId>
			  <artifactId>protostuff-collectionschema</artifactId>
			  <version>${protostuff.version}</version>
			</dependency>
<protostuff.version>1.0.8</protostuff.version>

序列化的几种方式

http://my-corner.iteye.com/blog/1776512

Java序列化简单了解

http://hanchaohan.blog.51cto.com/2996417/922470

jprotobuf的简单了解

https://github.com/jhunters/jprotobuf

java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子

http://www.cnblogs.com/xiaoMzjm/p/4555209.html

时间: 2024-07-29 12:47:44

java序列化之protobuf的相关文章

深入分析java序列化

概念 先来点简单的概念: what?why? 什么是序列化?为什么要序列化? 答曰:将java对象转成字节序列,用以传输和保存 where? 使用场景是什么? 答曰:对象的传输:状态的备份,例如jvm的dump文件: 好了,不装*了,下面说的详细点.其实对象的序列化主要有两种用途: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 在网络上传送对象的字节序列 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Sessio

几种Java序列化方式的实现

0.前言 本文主要对几种常见Java序列化方式进行实现.包括Java原生以流的方法进行的序列化.Json序列化.FastJson序列化.Protobuff序列化. 1.Java原生序列化 Java原生序列化方法即通过Java原生流(InputStream和OutputStream之间的转化)的方式进行转化.需要注意的是JavaBean实体类必须实现Serializable接口,否则无法序列化.Java原生序列化代码示例如下所示: package serialize; import java.io

Java序列化的几种方式以及序列化的作用

Java序列化的几种方式以及序列化的作用 本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用    有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象.例如,有的时候我们想要 把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流.对于这种通用 的操作,我们为什么不使用统一的格式呢?没错,这里就出现了java

浅析若干Java序列化工具

??在java中socket传输数据时,数据类型往往比较难选择.可能要考虑带宽.跨语言.版本的兼容等问题.比较常见的做法有: 采用java对象的序列化和反序列化 把对象包装成JSON字符串传输 Google工具protoBuf的开源 本文章所需要的序列化jar包都可以下载:http://download.csdn.net/detail/u013256816/9439971. ??为了便于说明各个做法的区别,分别对这三种做法进行阐述. 对UserVo对象进行序列化,class UserVo如下:

Java序列化技术与Protobuff

前言: Java序列化是Java技术体系当中的一个重要议题,序列化的意义在于信息的交换和存储,通常会和io.持久化.rmi技术有关(eg:一些orm框架会要求持久化的对象类型实现Serializable接口). 本文将提供Java自带序列化机制和ProtoStuff的序列化(仅仅当作一种数据格式)的比较,从序列化的内容和特点来对二者进行比较. 结论:1,Java序列化对象时不需要通过属性的get set方法或其它无关序列化内部定义的方法(比如readObject,writeObject是内置的序

针对工作中的需要对已有的Java序列化工具分析

针对java原生序列化,以及优化过的java序列化工具列举说明.自己定义的类名(IOSerializable).(Fast Serialization).(FastjsonSerializable) 1.java序列化简介 序列化就是指对象通过写出描述自己状态的数值来记录自己的过程,即将对象表示成一系列有序字节,Java提供了将对象写入流和从流中恢复对象的方法.对象能包含其它的对象,而其它的对象又可以包含另外的对象.JAVA序列化能够自动的处理嵌套的对象.对于一个对象的简单域,writeObje

Java序列化(Serializable)与反序列化

序列化是干什么的 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化. 什么情况下需要序列化 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候: 当你想用套接字在网络上传送对象的时候: 当你想通过RMI传输对象的时候: 序列化的几种方式 在Java中socket传输数据时,数据类型往往比较难

Java序列化、反序列化

序列化是干什么的 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化. 什么情况下需要序列化 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候: 当你想用套接字在网络上传送对象的时候: 当你想通过RMI传输对象的时候: 序列化的几种方式 在Java中socket传输数据时,数据类型往往比较难

Java序列化的几种方式

本文着重解说一下Java序列化的相关内容. 假设对Java序列化感兴趣的同学能够研究一下. 一.Java序列化的作用    有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象.比如.有的时候我们想要 把一个Java对象写入到硬盘或者传输到网路上面的其他计算机,这时我们就须要自己去通过java把对应的对象写成转换成字节流.对于这样的通用 的操作.我们为什么不使用统一的格式呢?没错,这里就出现了java的序列化的概念.在Java的Output