I assume that you want to create one deserializer for all your interfaces and their respective implementations. Follow these steps:
1. Create a basic interface that will be expanded by your other application interfaces. It is required to create a single deserializer for all your interfaces and implementation classes.
public interface Convertable { String getClassName(); }
2. Create your own function interface and implementation class. As an example, let's name them FooInterface and FooClass. FooInterface should extend the Convertable interface.
FooInterface
public interface FooInterface extends Convertable { }
Fooclass
public class FooClass implements FooInterface {
Note that the value returned by getClassName () is used as the discriminator field that will be used in the Gson Deserializer (next step) to initialize the returned instance. I assume that your serializer and the deserializer class will be in the same package, even if they are in different client and server applications. If not, you will need to change the implementation of getClassInstance (), but it will be quite simple to do so.
3. Deploy a custom Gson serializer for your entire application.
import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; public class ConvertableDeserializer<T extends Convertable> implements JsonDeserializer<T> { private static final String CLASSNAME = "className"; public T deserialize(final JsonElement jsonElement, final Type type, final JsonDeserializationContext deserializationContext ) throws JsonParseException { final JsonObject jsonObject = jsonElement.getAsJsonObject(); final JsonPrimitive prim = (JsonPrimitive) jsonObject.get(CLASSNAME); final String className = prim.getAsString(); final Class<T> clazz = getClassInstance(className); return deserializationContext.deserialize(jsonObject, clazz); } @SuppressWarnings("unchecked") public Class<T> getClassInstance(String className) { try { return (Class<T>) Class.forName(className); } catch (ClassNotFoundException cnfe) { throw new JsonParseException(cnfe.getMessage()); } } }
4. Register the deserializer with Gson and initialize the modification
private static GsonConverterFactory buildGsonConverter() { final GsonBuilder builder = new GsonBuilder();
You can register an adapter for all your implementations, if you want, using:
builder.registerTypeAdapter(Convertable.class, new ConvertableDeserializer<Convertable>());