分佈式項目中,也許會用到不同的序列化方式,自己整理了常見的序列化方式,手寫了一個序列化引擎。
引擎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