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