标签:java 序列化 protostuff
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
本文出自 “我的JAVA世界” 博客,请务必保留此出处http://hanchaohan.blog.51cto.com/2996417/1962798
标签:java 序列化 protostuff
原文地址:http://hanchaohan.blog.51cto.com/2996417/1962798