Вопрос Сериализация объекта класса Inventory

Версия Minecraft
1.20.X

FiGuRt

Пользователь
Сообщения
29
Решения
1
Столкнулся с такой ситуацией, хочу сделать хранилище в клане, которое будет доступно только участникам этого клана. Появилась идея сделать это через сериализацию Inventory, то есть преобразовать объект в строку или еще что-нибудь, а позже преобразовать обратно, но я без понятия как такое правильно сделать. Может кто-то поможет с этим или предложит альтернативный способ решения проблемы?
 
Решение
Java:
    public static String itemStackArrayToBase64(ItemStack[] items) {
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);

            dataOutput.writeInt(items.length);

            for (ItemStack item : items) {
                dataOutput.writeObject(item);
            }

            dataOutput.close();
            return Base64Coder.encodeLines(outputStream.toByteArray());
        } catch (Exception e) {
            throw new IllegalStateException("Unable to save item stacks.", e);
        }
    }

    public static ItemStack[] itemStackArrayFromBase64(String data) {
        try {...
Java:
    public static String itemStackArrayToBase64(ItemStack[] items) {
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);

            dataOutput.writeInt(items.length);

            for (ItemStack item : items) {
                dataOutput.writeObject(item);
            }

            dataOutput.close();
            return Base64Coder.encodeLines(outputStream.toByteArray());
        } catch (Exception e) {
            throw new IllegalStateException("Unable to save item stacks.", e);
        }
    }

    public static ItemStack[] itemStackArrayFromBase64(String data) {
        try {
            ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
            BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
            ItemStack[] items = new ItemStack[dataInput.readInt()];

            for (int i = 0; i < items.length; i++) {
                items[i] = (ItemStack) dataInput.readObject();
            }

            dataInput.close();
            return items;
        } catch (ClassNotFoundException | IOException e) {
            throw new RuntimeException(e);
        }
    }

Использование:
Java:
// Инвентарь в строку
Inventory inventory =...
String content = InventorySerialize.itemStackArrayToBase64(inventory.getContents());

// Строку в инвентарь
String content =...
inventory.setContents(InventorySerialize.itemStackArrayFromBase64(content));
 
Назад
Сверху Снизу