Войти или зарегистрироваться

Помогите Сохранение данных из HashMap

  • Автор темы Автор темы Aviloo
  • Дата начала Дата начала

Aviloo

Активный участник
Пользователь
Баллы
61
Имя в Minecraft
Aviloo
Всем привет. У меня в проекте есть много HashMap , но после перезагрузки или выключения сервера данные(ключ и значение) из них теряются . Если какой-нибудь способ сохранять их даже после выключения , по типу сохранения в файл и последующей загрузке в методе onEnable , и сохранении в onDisable. Заранее спасибо.
 
Ты сам ответил на свой вопрос. Храни в файлах или бд
 
Да, тебе необходимо сериализовывать собственные объекты в примитивные типы данных и записывать в конфиг/базу.

Если в базу - можно серализовать в строку (json/base64) или маccив байт (blob).

Если нужно именно в конфиг - можешь посмотреть в сторону ConfigurationSerializable.
Пример сериалзиации Location:
upload_2022-8-19_11-46-46.png
 
Да, тебе необходимо сериализовывать собственные объекты в примитивные типы данных и записывать в конфиг/базу.

Если в базу - можно серализовать в строку (json/base64) или маccив байт (blob).

Если нужно именно в конфиг - можешь посмотреть в сторону ConfigurationSerializable.
Пример сериалзиации Location:
Посмотреть вложение 63309
У меня такая же проблема, с загрузкой данных в бд всё окей, но проблемы с выгрузкой.
 
Без кода сложно что-то сказать, показывай
Загрузил я его вот таким образом.
Код:
public void saveResident() {

        for (Resident resident : residents) {

            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".name", resident.getName());
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".uniqueId", resident.getUniqueId().toString());
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".profession", null);
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".state", resident.getState().getName());
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".lastState", resident.getLastState().getName());
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".created", resident.getCreated());
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".reputation", resident.getReputation());
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".stateReputation", resident.getStateReputation());
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".killedAllies", resident.getKilledAllies());
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".killedEnemies", resident.getKilledEnemies());
            StateConfig.getResidentsYaml().set("residents." + resident.getName() + ".timeInState", resident.getTimeInState());

            try {
                StateConfig.getResidentsYaml().save(StateConfig.getResidentsFile());
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

И выгрузка.
Код:
public void loadResidents() {

        if (!StateConfig.getResidentsYaml().isConfigurationSection("residents")) {
            return;
        }

        for (String key : StateConfig.getStatesYaml().getConfigurationSection("residents").getKeys(false)) {

            String name = key;
            UUID uuid = UUID.fromString(StateConfig.getResidentsYaml().getString("residents." + key + ".uniqueId"));

            Profession profession = null;

            State state = IridiumState.getInstance().getState(StateConfig.getResidentsYaml().getString("residents." + key + ".state"));
            State lastState = IridiumState.getInstance().getState(StateConfig.getResidentsYaml().getString("residents." + key + ".lastState"));

            String created = StateConfig.getResidentsYaml().getString("residents." + key + ".created");

            Integer reputation = StateConfig.getResidentsYaml().getInt("residents." + key + ".reputation");
            Integer stateReputation = StateConfig.getResidentsYaml().getInt("residents." + key + ".stateReputation");

            Integer killedAllies = StateConfig.getResidentsYaml().getInt("residents." + key + ".killedAllies");
            Integer killedEnemies = StateConfig.getResidentsYaml().getInt("residents." + key + ".killedEnemies");

            String timeInState = StateConfig.getResidentsYaml().getString("residents." + key + ".timeInState");

            residents.add(new Resident(name, uuid, profession, state, lastState, created, reputation, stateReputation, killedAllies, killedEnemies, timeInState));

        }

    }
 
Загрузка и выгрузка states:

Код:
public void saveStates() {

        for (State state : states) {

            StateConfig.getStatesYaml().set("states." + state.getName() + ".name", state.getName());
            StateConfig.getStatesYaml().set("states." + state.getName() + ".leader", state.getLeader().getName());

            StateConfig.getStatesYaml().set("states." + state.getName() + ".spawn.x", state.getSpawn().getX());
            StateConfig.getStatesYaml().set("states." + state.getName() + ".spawn.y", state.getSpawn().getY());
            StateConfig.getStatesYaml().set("states." + state.getName() + ".spawn.z", state.getSpawn().getZ());
            StateConfig.getStatesYaml().set("states." + state.getName() + ".spawn.yaw", state.getSpawn().getYaw());
            StateConfig.getStatesYaml().set("states." + state.getName() + ".spawn.pitch", state.getSpawn().getPitch());
            StateConfig.getStatesYaml().set("states." + state.getName() + ".spawn.world", state.getSpawn().getWorld().getName());

            StateConfig.getStatesYaml().set("states." + state.getName() + ".created", state.getCreated());

            StateConfig.getStatesYaml().set("states." + state.getName() + ".killedAllies", state.getKilledAllies());
            StateConfig.getStatesYaml().set("states." + state.getName() + ".killedEnemies", state.getKilledEnemies());

            List<String> residents = new ArrayList<String>();
            List<String> helpers = new ArrayList<String>();
            List<String> allies = new ArrayList<String>();
            List<String> enemies = new ArrayList<String>();

            for (Resident resident : state.getResidents()) {
                residents.add(resident.getName());
            }

            for (Resident helper : state.getHelpers()) {
                helpers.add(helper.getName());
            }

            for (State ally : state.getAllies()) {
                allies.add(ally.getName());
            }

            for (State enemy : state.getEnemies()) {
                enemies.add(enemy.getName());
            }

            StateConfig.getStatesYaml().set("states." + state.getName() + ".towns", state.getTowns());
            StateConfig.getStatesYaml().set("states." + state.getName() + ".residents", residents);
            StateConfig.getStatesYaml().set("states." + state.getName() + ".helpers", helpers);
            StateConfig.getStatesYaml().set("states." + state.getName() + ".allies", allies);
            StateConfig.getStatesYaml().set("states." + state.getName() + ".enemies", enemies);

            try {
                StateConfig.getStatesYaml().save(StateConfig.getStatesFile());
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

    public void loadStates() {

        if (!StateConfig.getStatesYaml().isConfigurationSection("states")) {
            return;
        }

        for (String key : StateConfig.getStatesYaml().getConfigurationSection("states").getKeys(false)) {

            String name = key;

            Resident leader = IridiumState.getInstance().getResident(
                    StateConfig.getStatesYaml().getString("states." + key + ".leader"));

            Location spawn = new Location(
                    Bukkit.getWorld(StateConfig.getStatesYaml().getString("states." + key + ".spawn.world")),
                    StateConfig.getStatesYaml().getDouble("states." + key + ".spawn.x"),
                    StateConfig.getStatesYaml().getDouble("states." + key + ".spawn.y"),
                    StateConfig.getStatesYaml().getDouble("states." + key + ".spawn.z"),
                    (float) StateConfig.getStatesYaml().getDouble("states." + key + ".spawn.yaw"),
                    (float) StateConfig.getStatesYaml().getDouble("states." + key + ".spawn.pitch"));

            String created = StateConfig.getStatesYaml().getString("states." + key + ".created");

            Integer killedAllies = StateConfig.getStatesYaml().getInt("states." + key + ".killedAllies");
            Integer killedEnemies = StateConfig.getStatesYaml().getInt("states." + key + ".killedEnemies");

            List<String> towns = StateConfig.getStatesYaml().getStringList("states." + key + ".towns");

            List<Resident> residents = new ArrayList<Resident>();
            List<Resident> helpers = new ArrayList<Resident>();
            List<State> allies = new ArrayList<State>();
            List<State> enemies = new ArrayList<State>();

            for (String resident : StateConfig.getStatesYaml().getStringList("states." + key + ".residents")) {
                residents.add(IridiumState.getInstance().getResident(resident));
            }

            for (String helper : StateConfig.getStatesYaml().getStringList("states." + key + ".helpers")) {
                helpers.add(IridiumState.getInstance().getResident(helper));
            }

            for (String ally : StateConfig.getStatesYaml().getStringList("states." + key + ".allies")) {
                allies.add(IridiumState.getInstance().getState(ally));
            }

            for (String enemy : StateConfig.getStatesYaml().getStringList("states." + key + ".enemies")) {
                enemies.add(IridiumState.getInstance().getState(enemy));
            }

            IridiumState.getInstance().getStates().add(
                    new State(name, leader, spawn, created, killedAllies, killedEnemies, towns, residents, helpers, allies, enemies));

        }


    }
 
Теперь в onEnable() прописываю:
// loadResidents();
// loadStates();

чтобы загрузить из конфига. Если поставить loadResidents() выше, то он загружается первым чем loadStates() и выдаёт ошибку из-за того, что state и lastState null (т.к они еще не выгружены). Если я поставлю loadStates() выше, то он загружается первым чем loadResidents(), то выдаёт мне ошибку Resident это нулл, он не выгружен.
 
Может быть, есть способы получше? Я умею только так, а с ConfigurationSerializable дел не имел
 
Может быть, есть способы получше? Я умею только так, а с ConfigurationSerializable дел не имел
Есть способ по легче, сам его юзаю, сохранять в YamlConfiguration и загружать при запуске в мапу, рассказать?
 
Есть способ по легче, сам его юзаю, сохранять в YamlConfiguration и загружать при запуске в мапу, рассказать?
Да, хоть и я решил свою проблему. Я сперва загрузил резиденты первыми и оставил State как null. А потом загрузил все State и заменил null у резидента на State.
 
Да, хоть и я решил свою проблему. Я сперва загрузил резиденты первыми и оставил State как null. А потом загрузил все State и заменил null у резидента на State.
Код:
File fileMapa = new File("plugins/ТвойПлагин/Data(как хочешь).yml");
YamlConfiguration ymldata = YamlConfiguration.loadConfiguration(fileMapa);
for (String key : ymldata.getKeys(false)) { // Цикл получения данных
                
                MAPA.put(key, (Integer) ymldata.get(key)); // Загрузка из списка в мапу
                System.out.println("Succesfully to loading data list."); 
            }

Код:
        for(Map.Entry entry : MAPA.entrySet()) { // Цикл получения данных из мапы по очереди
            ymldata.set((String) entry.getKey(), (Integer) entry.getValue()); //Ну запись данных из мапы в файл
            try {
                ymldata.save(fileMapa); // Сохранение
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
По мне это более лёгкий способ сохранения файлов.
 
Юзац YamlConfiguration из ведроапи, тот же хешмап, только сериализуемый в файл. Если нужен упакованный вариант записи для экономии места на диске, используй jnbt.
 
Назад
Верх