Deserialización de un tipo genérico con tiempo de compilación desconocido donde un campo indica el tipo

Esto funciona pero es horrible, ¿hay una mejor manera?

Tengo una clase genérica que en este ejemplo simple es la siguiente

public class MsgWrapper<T> {
@Expose
private T Message;
@Expose
private String Type;
private String uri;
}

La serialización es desagradable pero trivial, por ejemplo,

Type typeToken = new TypeToken<MsgWrapper<Notice>>(){}.getType();
gson.toJson(message,typeToken);

El servidor recibe json que puede ser

MsgWrapper<Notice> or MsgWrapper<Alert>

Si se trata de un aviso, el campo 'Tipo' dirá 'aviso' Si es una alerta, el campo 'Tipo' dirá 'alerta'

En este momento he implementado un deserializador personalizado

        public MsgWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject object = json.getAsJsonObject();
        if(object.has("Type"))
        {
            MsgWrapper msgWrapper=new MsgWrapper();
            msgWrapper.setType(object.get("Type").getAsString());
            if(msgWrapper.getType().equalsIgnoreCase("Notice"))
            {
             msgWrapper.setMessage(context.deserialize(object.get("Message"), Notice.class));
            }
            else if(msgWrapper.getType().equalsIgnoreCase("Alert"))
            {
             msgWrapper.setMessage(context.deserialize(object.get("Message"), Alert.class));   
            }
            return msgWrapper;
        }
        else
        {
            throw new JsonParseException("something is wrong...");
        }
    }
}

Esto se siente profundamente torpe e incorrecto. ¿Hay una mejor manera?

Respuestas a la pregunta(1)

Su respuesta a la pregunta