我正在开发bukkit插件,正在尝试将整个广告资源保存在文件中。所以我使用以下命令将文件保存在字符串中:
    InventoriesData.set(player.getName(),ItemStack +“”);

但是现在将其另存为字符串,我不知道如何将其转换回ItemStack。
我知道我也可以单独保存所有数据,但是我想保存所有信息,并认为应该可以转换回去。那么,有人知道如何做到这一点吗?

它将返回此顺便说一句:
    ItemStack {BLAZE_ROD x 1,UNSPECIFIC_META:{meta-type = UNSPECIFIC,display-name = Inventory Selector,Current:2,enchants = {THORNS = 3}}}

最佳答案

要制作物品堆,您需要拥有物料和数量:

String s = /* your material string */;
Material m = Material.matchMaterial(s);
ItemStack stack = new ItemStack(m, 1);


但是,请注意ItemStackConfigurationSerializable,这意味着您可以直接将其直接保存到配置中:

ItemStack is = /*...*/;
getConfig().set("example", is);
is = (ItemStack) getConfig().get("example");


库存是上下文相关的,因此无法序列化。如果愿意,可以创建一个帮助程序类来跟踪装甲,并将非空中(null)堆栈作为一个类,然后将该类本身设置为ConfigurationSerializable

@SerializableAs("Inventory")
public class SInventory implements ConfigurationSerializable {

    private final List<ItemStack> items = new ArrayList<>();
    private ItemStack head;
    private ItemStack chest;
    private ItemStack legs;
    private ItemStack boots;

    /* Other fields */

    public SInventory(Map<String, Object> config) {
        List<ItemStack> items = (List<ItemStack>) config.get("inventory");
        for (ItemStack item : items) {
            if (item != null) {
                this.items.add(item);
            }
        }
        this.head = (ItemStack) config.get("head");
        this.chest = (ItemStack) config.get("chest");
        this.legs = (ItemStack) config.get("legs");
        this.boots = (ItemStack) config.get("boots");
    }

    public static SInventory valueOf(Map<String, Object> config) {
        return new SInventory(config);
    }

    public static SInventory deserialize(Map<String, Object> config) {
        return new SInventory(config);
    }

    @Override
    public Map<String, Object> serialize() {
        Map<String, Object> back = new HashMap<>();
        back.put("inventory", this.items);
        back.put("head", this.head);
        back.put("chest", this.chest);
        back.put("legs", this.legs);
        back.put("boots", this.boots);
        return back;
    }


Map<String, Object>是代表此清单的部分。因此,如果通过List<ItemStack>传递serialize并将其保存在字符串“ Inventory”下,则可以从地图中检索它,如下所示:

List<ItemStack> inv = (List<ItemStack>) map.get("Inventory");


这通常会导致一个更简单,更易于管理的系统。

07-28 12:31