io.afu.utils.serialize.SerializeUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of utils Show documentation
Show all versions of utils Show documentation
RffanLAB Utils For Many Way use
package io.afu.utils.serialize;
import com.google.common.collect.Maps;
import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class SerializeUtil {
/**
* 需要使用包装类进行序列化/反序列化的class集合
*/
private static final Set> WRAPPER_SET = new HashSet<>();
/**
* 序列化/反序列化包装类 Class 对象
*/
private static final Class WRAPPER_CLASS = SerializeDeserializeWrapper.class;
/**
* 序列化/反序列化包装类 Schema 对象
*/
private static final Schema WRAPPER_SCHEMA = RuntimeSchema.createFrom(WRAPPER_CLASS);
/**
* 缓存对象及对象schema信息集合
*/
private static final Map, Schema>> CACHE_SCHEMA = Maps.newConcurrentMap();
/**
* 预定义一些Protostuff无法直接序列化/反序列化的对象
*/
static {
WRAPPER_SET.add(List.class);
WRAPPER_SET.add(ArrayList.class);
WRAPPER_SET.add(CopyOnWriteArrayList.class);
WRAPPER_SET.add(LinkedList.class);
WRAPPER_SET.add(Stack.class);
WRAPPER_SET.add(Vector.class);
WRAPPER_SET.add(Map.class);
WRAPPER_SET.add(HashMap.class);
WRAPPER_SET.add(TreeMap.class);
WRAPPER_SET.add(Hashtable.class);
WRAPPER_SET.add(SortedMap.class);
WRAPPER_SET.add(Map.class);
WRAPPER_SET.add(Object.class);
}
/**
* 注册需要使用包装类进行序列化/反序列化的 Class 对象
*
* @param clazz 需要包装的类型 Class 对象
*/
public static void registerWrapperClass(Class clazz) {
WRAPPER_SET.add(clazz);
}
/**
* 获取序列化对象类型的schema
*
* @param cls 序列化对象的class
* @param 序列化对象的类型
* @return 序列化对象类型的schema
*/
@SuppressWarnings({"unchecked", "rawtypes"})
private static Schema getSchema(Class cls) {
Schema schema = (Schema) CACHE_SCHEMA.get(cls);
if (schema == null) {
schema = RuntimeSchema.createFrom(cls);
CACHE_SCHEMA.put(cls, schema);
}
return schema;
}
/**
* 序列化对象
*
* @param obj 需要序列化的对象
* @param 序列化对象的类型
* @return 序列化后的二进制数组
*/
@SuppressWarnings("unchecked")
public static byte[] serialize(T obj) {
Class clazz = (Class) obj.getClass();
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
try {
Object serializeObject = obj;
Schema schema = WRAPPER_SCHEMA;
if (!WRAPPER_SET.contains(clazz)) {
schema = getSchema(clazz);
} else {
serializeObject = SerializeDeserializeWrapper.builder(obj);
}
return ProtostuffIOUtil.toByteArray(serializeObject, schema, buffer);
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
} finally {
buffer.clear();
}
}
/**
* 反序列化对象
*
* @param data 需要反序列化的二进制数组
* @param clazz 反序列化后的对象class
* @param 反序列化后的对象类型
* @return 反序列化后的对象集合
*/
public static T deserialize(byte[] data, Class clazz) {
try {
if (!WRAPPER_SET.contains(clazz)) {
T message = clazz.newInstance();
Schema schema = getSchema(clazz);
ProtostuffIOUtil.mergeFrom(data, message, schema);
return message;
} else {
SerializeDeserializeWrapper wrapper = new SerializeDeserializeWrapper<>();
ProtostuffIOUtil.mergeFrom(data, wrapper, WRAPPER_SCHEMA);
return wrapper.getData();
}
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
// public static void main(String[] args) {
//
//
//
// SerializeDeserializeWrapper wrapper = SerializeDeserializeWrapper.builder(map);
// SerializeDeserializeWrapper wrapper = new SerializeDeserializeWrapper();
//
// byte[] serializeBytes = serialize(wrapper);
// System.out.println("序列化map集合二进制数组长度 length=" + serializeBytes.length);
//
// Map map1 = deserialize(serializeBytes, Map.class);
// SerializeDeserializeWrapper deserializeWrapper = deserialize(serializeBytes, SerializeDeserializeWrapper.class);
// System.out.println("反序列化map对象:" + deserializeWrapper.getData());
//
// }
}