es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo deserializar correctamente ItemStack?

Estoy trabajando en una forma de guardar ItemStacks en una base de datos MySQL. La serialización y el guardado funcionan bien, pero al deserializarlo, solo obtengo el Item sin el ItemMeta (por ejemplo, el Item no está encantado después de la deserialización).

¿Alguien tiene alguna idea de cómo deserializarlo correctamente? Encontré mucha información al respecto en Internet, pero todo estaba desactualizado y no funcionaba con la versión 1.16.4.

Mis funciones:

“`java
private static String itemStackToString(ItemStack item) {
Gson gson = new Gson();
return gson.toJson(item.serialize());
}

private static ItemStack stringToItemStack(String str) {
Gson gson = new Gson();
Map<string, object=""> map = gson.fromJson(str, new TypeToken<><string, object="">>(){}.getType());
return ItemStack.deserialize(map);
}
“`</string,></string,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con la deserialización se debe a que el ItemMeta no se está serializando junto con el ItemStack. Una forma de solucionarlo es serializar el ItemMeta por separado y luego combinarlo con los datos serializados del ItemStack antes de deserializarlo.

    Para hacer esto, puede modificar la función itemStackToString para serializar el ItemMeta por separado y guardarlo en un mapa aparte:

    private static String itemStackToString(ItemStack item) {
        Gson gson = new Gson();
        Map<string, object=""> map = item.serialize();
        if (item.hasItemMeta()) {
            map.put("meta", item.getItemMeta().serialize());
        }
        return gson.toJson(map);
    }
    

    Luego, modifique la función stringToItemStack para deserializar primero el mapa de ItemMeta y luego aplicarlo al ItemStack:

    private static ItemStack stringToItemStack(String str) {
        Gson gson = new Gson();
        Map<string, object=""> map = gson.fromJson(str, new TypeToken<><string, object="">>(){}.getType());
        ItemStack item = ItemStack.deserialize(map);
        if (map.containsKey("meta")) {
            item.setItemMeta(ItemMeta.deserialize((Map<string, object="">) map.get("meta")));
        }
        return item;
    }
    

    Con estas modificaciones, el ItemMeta debería deserializarse correctamente junto con el ItemStack.</string,></string,></string,></string,>

Comments are closed.