Commit edce5a4c authored by shaojin.wensj's avatar shaojin.wensj
Browse files

support module spi

parent c3a82326
Showing with 97 additions and 0 deletions
+97 -0
......@@ -48,6 +48,7 @@ import com.alibaba.fastjson.asm.ClassReader;
import com.alibaba.fastjson.asm.TypeCollector;
import com.alibaba.fastjson.parser.deserializer.*;
import com.alibaba.fastjson.serializer.*;
import com.alibaba.fastjson.spi.Module;
import com.alibaba.fastjson.util.*;
import com.alibaba.fastjson.util.IdentityHashMap;
import com.alibaba.fastjson.util.ServiceLoader;
......@@ -118,6 +119,7 @@ public class ParserConfig {
private boolean jacksonCompatible = false;
public boolean compatibleWithJavaBean = TypeUtils.compatibleWithJavaBean;
private List<Module> modules = new ArrayList<Module>();
{
denyHashCodes = new long[]{
......@@ -448,6 +450,14 @@ public class ParserConfig {
return derializer;
}
for (Module module : modules) {
derializer = module.createDeserializer(this, clazz);
if (derializer != null) {
putDeserializer(type, derializer);
return derializer;
}
}
String className = clazz.getName();
className = className.replace('$', '.');
......@@ -1193,4 +1203,8 @@ public class ParserConfig {
public void register(String typeName, Class type) {
typeMapping.putIfAbsent(typeName, type);
}
public void register(Module module) {
this.modules.add(module);
}
}
......@@ -20,6 +20,7 @@ import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.annotation.JSONType;
import com.alibaba.fastjson.parser.deserializer.Jdk8DateCodec;
import com.alibaba.fastjson.parser.deserializer.OptionalCodec;
import com.alibaba.fastjson.spi.Module;
import com.alibaba.fastjson.support.springfox.SwaggerJsonSerializer;
import com.alibaba.fastjson.util.*;
import com.alibaba.fastjson.util.IdentityHashMap;
......@@ -73,6 +74,8 @@ public class SerializeConfig {
4165360493669296979L,
4446674157046724083L
};
private List<Module> modules = new ArrayList<Module>();
public String getTypeKey() {
return typeKey;
......@@ -471,6 +474,14 @@ public class SerializeConfig {
writer = serializers.get(clazz);
}
}
for (Module module : modules) {
writer = module.createSerializer(this, clazz);
if (writer != null) {
serializers.put(clazz, writer);
return writer;
}
}
if (writer == null) {
String className = clazz.getName();
......@@ -802,4 +813,8 @@ public class SerializeConfig {
this.serializers.clear();
this.initSerializers();
}
public void register(Module module) {
this.modules.add(module);
}
}
package com.alibaba.fastjson.spi;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
public interface Module {
ObjectDeserializer createDeserializer(ParserConfig config, Class type);
ObjectSerializer createSerializer(SerializeConfig config, Class type);
}
package com.alibaba.json.bvt;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import com.alibaba.fastjson.serializer.MiscCodec;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.spi.Module;
import junit.framework.TestCase;
public class ModuleTest extends TestCase {
public void test_for_module() throws Exception {
ParserConfig config = new ParserConfig();
config.register(new MyModuel2());
config.register(new MyModuel());
assertSame(MiscCodec.instance, config.getDeserializer(A.class));
}
public void test_for_module_1() throws Exception {
SerializeConfig config = new SerializeConfig();
config.register(new MyModuel2());
config.register(new MyModuel());
assertSame(MiscCodec.instance, config.getObjectWriter(A.class));
}
public static class A {
}
public static class MyModuel implements Module {
@Override
public ObjectDeserializer createDeserializer(ParserConfig config, Class type) {
return MiscCodec.instance;
}
@Override
public ObjectSerializer createSerializer(SerializeConfig config, Class type) {
return MiscCodec.instance;
}
}
public static class MyModuel2 implements Module {
@Override
public ObjectDeserializer createDeserializer(ParserConfig config, Class type) {
return null;
}
@Override
public ObjectSerializer createSerializer(SerializeConfig config, Class type) {
return null;
}
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment