分布式项目中,也许会用到不同的序列化方式,自己整理了常见的序列化方式,手写了一个序列化引擎。
引擎SerializerEngine.java代码如下:
package ares.remoting.framework.serialization.engine;
import ares.remoting.framework.serialization.common.SerializeType;
import ares.remoting.framework.serialization.serializer.ISerializer;
import ares.remoting.framework.serialization.serializer.impl.*;
import avro.shaded.com.google.common.collect.Maps;
import java.util.Map;
/**
* @author fuss created on 18/7/23.
* @version $Id$
*/
public class SerializerEngine {
public static final Map<SerializeType, ISerializer> serializerMap = Maps.newConcurrentMap();
static {
serializerMap.put(SerializeType.DefaultJavaSerializer, new DefaultJavaSerializer());
serializerMap.put(SerializeType.HessianSerializer, new HessianSerializer());
serializerMap.put(SerializeType.JSONSerializer, new JSONSerializer());
serializerMap.put(SerializeType.XmlSerializer, new XmlSerializer());
serializerMap.put(SerializeType.ProtoStuffSerializer, new ProtoStuffSerializer());
serializerMap.put(SerializeType.MarshallingSerializer, new MarshallingSerializer());
//以下三类不能使用普通的java bean
serializerMap.put(SerializeType.AvroSerializer, new AvroSerializer());
serializerMap.put(SerializeType.ThriftSerializer, new ThriftSerializer());
serializerMap.put(SerializeType.ProtocolBufferSerializer, new ProtocolBufferSerializer());
}
public static <T> byte[] serialize(T obj, String serializeType) {
SerializeType serialize = SerializeType.queryByType(serializeType);
if (serialize == null) {
throw new RuntimeException("serialize is null");
}
ISerializer serializer = serializerMap.get(serialize);
if (serializer == null) {
throw new RuntimeException("serialize error");
}
try {
return serializer.serialize(obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static <T> T deserialize(byte[] data, Class<T> clazz, String serializeType) {
SerializeType serialize = SerializeType.queryByType(serializeType);
if (serialize == null) {
throw new RuntimeException("serialize is null");
}
ISerializer serializer = serializerMap.get(serialize);
if (serializer == null) {
throw new RuntimeException("serialize error");
}
try {
return serializer.deserialize(data, clazz);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
序列化类型枚举类SerializeType.java,代码如下:
package ares.remoting.framework.serialization.common;
import org.apache.commons.lang.StringUtils;
/**
* @author fuss created on 18/7/23.
* @version $Id$
*/
public enum SerializeType {
DefaultJavaSerializer("DefaultJavaSerializer"),
HessianSerializer("HessianSerializer"),
JSONSerializer("JSONSerializer"),
ProtoStuffSerializer("ProtoStuffSerializer"),
XmlSerializer("XmlSerializer"),
MarshallingSerializer("MarshallingSerializer"),
AvroSerializer("AvroSerializer"),
ProtocolBufferSerializer("ProtocolBufferSerializer"),
ThriftSerializer("ThriftSerializer");
private String serializeType;
private SerializeType(String serializeType) {
this.serializeType = serializeType;
}
public static SerializeType queryByType(String serializeType) {
if (StringUtils.isBlank(serializeType)) {
return null;
}
for (SerializeType serialize : SerializeType.values()) {
if (StringUtils.equals(serializeType, serialize.getSerializeType())) {
return serialize;
}
}
return null;
}
public String getSerializeType() {
return serializeType;
}
}
序列化引擎SerializerEngine通过static块,在类加载的时候将9类序列化算法注册到本地缓存serializerMap中,提供了相应的序列化与反序列化通用处理方法。
通过引擎可以通过传入类型参数的方式,灵活选择具体的序列化/发序列化方案,做到序列化和反序列化的可配置化。
其中,9种序列化方式,我会采用策略模式分别实现,实现类列表:
DefaultJavaSerializer.java
XmlSerializer.java
JSONSerializer.java
HessianSerializer.java
ProtocolBufferSerializer.java
ProtoStuffSerializer.java
ThriftSerializer.java
AvroSerializer.java
MarshallingSerializer.java