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

Ошибка записи при ConfigurationSerializable в YAML

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

Migel

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Migel077
Вот мой класс ConfigurationSerializable

Код:
package discordhelper.discordhelper.utils;

import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.jetbrains.annotations.NotNull;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class LinkResponse implements ConfigurationSerializable {

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SerializableField{
        public String discord();
    }

    @SerializableField(discord="discordId")
    private Long discordId;
    @SerializableField(discord="timestamp")
    private Long timestamp;
    @SerializableField(discord="discordName")
    private String discordName;

    public LinkResponse() {}
    public LinkResponse(Map<String, Object> map){
        Class<? extends LinkResponse> clazz = getClass();

        try {
            for (Field field : clazz.getDeclaredFields()) {
                SerializableField annotation = field.getAnnotation(SerializableField.class);

                if (annotation == null || map.get(annotation.discord()) == null) continue;
                Object object = map.get(annotation.discord());
                field.setAccessible(true);
                field.set(this, object);
            }
        } catch (IllegalAccessException | IllegalArgumentException e){
            e.printStackTrace();
        }
    }
    public Long getDiscordId(){
        return discordId;
    }
    public String getDiscordIdAsString(){
        return String.valueOf(discordId);
    }
    public void setDiscordId(Long discordId){
        this.discordId = discordId;
    }
    public void setDiscordId(String discordIdAsString){
        this.discordId = Long.parseLong(discordIdAsString);
    }
    public Long getTimestamp(){
        return timestamp;
    }
    public String getTimestampAsString(){
        return String.valueOf(timestamp);
    }
    public void setTimestamp(Long timestamp){
        this.timestamp = timestamp;
    }
    public void setTimestamp(String timestampAsStirng){
        this.timestamp = Long.valueOf(timestampAsStirng);
    }
    public String getDiscordName(){
        return discordName;
    }
    public void setDiscordName(String discordName){
        this.discordName = discordName;
    }
    @Override
    public @NotNull Map<String, Object> serialize() {
        Map<String, Object> map = new HashMap<String, Object>();

        Class<? extends LinkResponse> clazz = getClass();

        try {
            for (Field field : clazz.getDeclaredFields()) {
                SerializableField annotation = field.getAnnotation(SerializableField.class);
                if (annotation == null) continue;
                String discord = annotation.discord();
                map.put(discord, this);
            }
        } catch (IllegalArgumentException e){
            e.printStackTrace();
        }

        return map;
    }

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

}

А вот так я его записываю:

Код:
LinkResponse response = new LinkResponse();
                response.setDiscordId("84848979744");
                response.setDiscordName("Migel");
                response.setTimestamp(4654564654L);

                dataFM.set("users.4.responses", response.getTimestamp());
                SaveDataYaml();

В YAML файле я получаю ссылки, а не значения, почему?
 
Ты кладешь в карту весь класс, а не значение field.
Скорее всего, потому что я перепутал пипец как, нужно класть в карту поле, получая его через класс, а не весь класс.
Код:
map.put(discord, field.get(this))
 
Тебе нужно реализовать эти два метода (serialize и deserialize) для записи и чтения нужных значений. Пример ниже.
Код:
public class LinkResponse implements ConfigurationSerializable {
    private String value;

    @Override
    public Map<String, Object> serialize() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("value", this.getter());
        return map;
    }
    public static LinkResponse deserialize(Map<String, Object> map) {
        LinkResponse obj = new LinkResponse();
        obj.setter((String) map.get("value"));
        return obj;
    }
 
    public String getter() {
        return value;
    }
 
    public void setter(String value) {
        this.value = value;
    }
}
Потом свой класс нужно зарегистрировать где то в onEnable или onLoad.
ConfigurationSerialization.registerClass(LinkResponse.class, "LinkResponse");
 
Последнее редактирование:
Назад
Верх