ConfigurationSerializable

serega6531

Старожил
Девелопер
Пользователь
Баллы
173
Как работает ConfigurationSerializable? Как сделать метод deserialize()? Почему у меня очищается конфиг при старте плагина? Нигде не нашёл примера.

Вот мой код:
Код:
package ru.serega6531.NearlySpawns;

import java.util.ArrayList;

import org.bukkit.Location;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
import org.bukkit.plugin.java.JavaPlugin;

public class NearlySpawns extends JavaPlugin {
 
    private static FileConfiguration config;
    private static ArrayList<Spawn> spawns = new ArrayList<Spawn>();
 
    public void onEnable(){
        ConfigurationSerialization.registerClass(Spawn.class);
        config = getConfig();
        for(String key : config.getConfigurationSection("spawns").getKeys(false)) {
            getLogger().info("Loading spawn named " + key);
            spawns.add(new Spawn(config.getConfigurationSection("spawns." + key).getValues(false)));
        }
        getCommand("addspawn").setExecutor(new CommandManager());
    }
 
    public void onDisable(){
        saveConfig();
    }

}
Код:
package ru.serega6531.NearlySpawns;

import java.util.HashMap;
import java.util.Map;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.configuration.serialization.ConfigurationSerializable;

public class Spawn implements ConfigurationSerializable {
 
    private Location location;
    private String name;
 
    public Spawn(Location location, String name){
        this.location = location;
        this.name = name;
    }
 
    public Location getLocation() {
        return location;
    }

    public String getName() {
        return name;
    }

    @Override
    public Map<String, Object> serialize() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", name);
        map.put("loc.x", location.getBlockX());
        map.put("loc.y", location.getBlockY());
        map.put("loc.z", location.getBlockZ());
        return map;
    }
 
    public Spawn(Map<String, Object> map){
        this(new Location(Bukkit.getWorlds().get(0), (int)map.get("loc.x"), (int)map.get("loc.y"), (int)map.get("loc.z")), (String)map.get("name"));
    }
}
 
Up!
Конфиг уже не очищается, но вылезает NPE на строке
Код:
spawns.add(new Spawn(config.getConfigurationSection("spawns." + key).getValues(false)));

Up!
 
Up!
Конфиг уже не очищается, но вылезает NPE на строке
Код:
spawns.add(new Spawn(config.getConfigurationSection("spawns." + key).getValues(false)));
Судя по всему config.getConfigurationSection("spawns." + key) вернуло вам null. Надо бы конечно еще видеть как вы сохраняете в конфиг, но если я правильно помню config.getConfigurationSection("spawns").getKeys(false) вернет полные имена ключей, т.е. spawns.name и получается в методе getConfigurationSection("spawns." + key) вы спрашиваете от ключа spawns.spawns.name. Не уверен, но стоит проверить.
Как работает ConfigurationSerializable? Как сделать метод deserialize()?
А зачем вам реализация deserialize? Контракт ConfigurationSerializable предполагает только serialize
 
В данном случае ConfigurationSerializable вообще не нужен.
просто сохраняем конфиг и всё. (config.save(path))
 
Если править конфиг руками не будет необходимости, можно использовать Gson.
С ним всё быстрее и понятнее.
 
Назад
Верх