Desserializando um genérico com tipo de tempo de compilação desconhecido, em que um campo indica o tipo

Isso funciona, mas é horrível - existe uma maneira melhor?

Eu tenho uma classe genérica que neste exemplo simples é a seguinte

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

Serialising é desagradável, mas trivial, por exemplo,

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

O servidor recebe json, que pode ser

MsgWrapper<Notice> or MsgWrapper<Alert>

Se for um aviso, o campo 'Tipo' dirá 'aviso' Se for um alerta, o campo 'Tipo' dirá 'alerta'

No momento em que implementei um desserializador 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...");
        }
    }
}

Isto parece profundamente desajeitado e errado. Existe uma maneira melhor

questionAnswers(1)

yourAnswerToTheQuestion