package jef.json;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import jef.tools.Assert;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
/**
* 对FastJSON的SerializeConfig稍作改变,以支持JSON/XML互转等一些功能。
* @author jiyi
*
*/
public class SerializeConfigEx extends SerializeConfig {
/**
* 接口的序列化器
*/
private Map<Class<?>, ObjectSerializer> typeCodecs;
/**
* 对传入类型和子类都生效的序列化器
* @param class1
* @param nodeSer
*/
public void putHierarchy(Class<?> class1, ObjectSerializer nodeSer) {
if (typeCodecs == null) {
typeCodecs = new HashMap<Class<?>, ObjectSerializer>();
}
typeCodecs.put(class1, nodeSer);
}
@Override
public ObjectSerializer getObjectWriter(Class<?> clazz) {
ObjectSerializer writer = get(clazz);
if(writer==null){
JSONCustom annotation = clazz.getAnnotation(JSONCustom.class);
if (annotation != null && annotation.serializer() != Void.class) {
ObjectSerializer os= createCustomSerializer(annotation.serializer());
putInternal(clazz,os);
return os;
}
}
if (writer == null) {
if (typeCodecs != null) {
for (Map.Entry<Class<?>, ObjectSerializer> e : typeCodecs.entrySet()) {
if (e.getKey().isAssignableFrom(clazz)) {
writer = e.getValue();
put(clazz, writer);
}
}
}
}
return super.getObjectWriter(clazz);
}
private ObjectSerializer createCustomSerializer(Class<?> serializer) {
Method m;
try {
m = serializer.getDeclaredMethod("getSerializer"); // try to get
// singleton
// instance.
m.setAccessible(true);
} catch (NoSuchMethodException e) {
try {
return (ObjectSerializer) serializer.newInstance();// call empty
// constructor
} catch (Exception e1) {
throw new IllegalStateException(e1);
}
}
try {
Object o = m.invoke(null);
Assert.notNull(o);
return (ObjectSerializer) o;
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
}