Помогите В конфиг попадает имя package класса

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

travnik

Активный участник
Пользователь
Баллы
76
Всем привет,
очень нужна помощь, формирую конфиг для плагина, но когда пытаюсь вставить в конфиг HashMap со своим классом, то в полученной файл почему то попадает имя пакаджа, где лежит класс MyClass
Код:
mysection:
  test222: !!ru.travnik.myplugin.MyClass
Вот как добавляю конфигурацию
Код:
HashMap<String, MyClass> count = new HashMap<String, MyClass>();
count.put("test", new MyClass(1, 1, 2, "test"));
count.put("test222", new MyClass(4, -1, 2, "test2"));
config.createSection("mysection", count);

Что нужно сделать чтобы в конфиг не попадало имя package, где лежит класс?
 
Я не знаю зачем тебе такое, но можно String[] str = text.split(\\.); и взять последний объект из массива.
 
MyClass представляет собой определенную структуру
 
Вот так сетится в конфиге твой класс !!ru.travnik.myplugin.MyClass. На сколько я понял, тебе нужно только название класса в конфиг пихнуть. Ну так раздели всю строку как я тебе показал выше split и возьми последний элемент массива и запиши его в конфиг. Это и будет название твоего класса.
Да и вообще, разве у класса нет getName(); ?
 
имя сетится не с класса, а то которое я указал, но перед полями класса сетит пакадж класса
 
А, так вы их и не записываете. Вы только класс записываете, а поля в никуда. Если вас надо создавать и сохранять классы, то используйте сериализацию или же записывайте каждое поле отдельно.
И вообще, опишите для чего вы это делаете. Ибо мне кажется вы какой то костыль сейчас делаете.
 
вот класс

Код:
package ru.travnik.travniksky;

public class BlockCountInfo {
    public int id;
    public int data;
    public int count;
    public String message;
 
    public BlockCountInfo()
    {
    }
 
    public BlockCountInfo(int id, int data, int count, String message) {
        super();
        this.id = id;
        this.data = data;
        this.count = count;
        this.message = message;
    }

    public boolean equals(Object obj){
        if (!(obj instanceof BlockCountInfo))
            return false;
        BlockCountInfo entry = (BlockCountInfo)obj;
        return equals(entry.id, entry.data);
    }
 
    public boolean equals(int id, int data){
        return this.id == id && this.data == data;
    }
 
    public boolean equals(int id){
        return this.id == id && this.data == Utils.NOT_USE_DATA;
    }
}
а вот какой конфиг получается

Код:
MaxCountBlocks:
  test222: !!ru.travnik.travniksky.BlockCountInfo
    count: 2
    data: -1
    id: 4
    message: test2
  test: !!ru.travnik.travniksky.BlockCountInfo
    count: 2
    data: 1
    id: 1
    message: test
 
Мне нужно чтобы конфиг получался

Код:
MaxCountBlocks:
  test222:
    count: 2
    data: -1
    id: 4
    message: test2
  test:
    count: 2
    data: 1
    id: 1
    message: test
в нем не было !!ru.travnik.travniksky.BlockCountInfo
 
@travnik, выглядит это так, как будто ConfigurationSection.createSection() автоматически сериализует (сохраняет состояние в файле) ваш класс. И чтобы его потом так же автоматически можно было десериализовать (загрузить из файла) просто необходимо знать какой это класс, поэтому он и записывается.
Если это очень сильно не нравится, то можно написать свой сериализатор/десериализатор, которому это не поданобится.
 
Решил вопрос таким способом

Код:
HashMap<String, Object> count = new HashMap<String, Object>();
        count.put("test", toConfigBlockCountInfo(new BlockCountInfo(1, 1, 2, "test")));
        count.put("test222", toConfigBlockCountInfo(new BlockCountInfo(4, -1, 2, "test2")));
        config.createSection(SECTION_MAX_COUNT, count);

Код:
private HashMap<String, Object> toConfigBlockCountInfo(BlockCountInfo info){
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("id", info.id);
        map.put("data", info.data);
        map.put("count", info.count);
        map.put("message", info.message);
        return map;
    }

@travnik, выглядит это так, как будто ConfigurationSection.createSection() автоматически сериализует (сохраняет состояние в файле) ваш класс. И чтобы его потом так же автоматически можно было десериализовать (загрузить из файла) просто необходимо знать какой это класс, поэтому он и записывается.
Если это очень сильно не нравится, то можно написать свой сериализатор/десериализатор, которому это не поданобится.
Так вот если удалить "!!ru.travnik.travniksky.BlockCountInfo" из конфига, то броблем с десериализацией никаких нет. Может какие есть настройки для сериализации, чтобы не сериализовало лишнюю информацию
 
Так вот если удалить "!!ru.travnik.travniksky.BlockCountInfo" из конфига, то броблем с десериализацией никаких нет. Может какие есть настройки для сериализации, чтобы не сериализовало лишнюю информацию
Может быть.
 
Решил вопрос таким способом

Код:
HashMap<String, Object> count = new HashMap<String, Object>();
        count.put("test", toConfigBlockCountInfo(new BlockCountInfo(1, 1, 2, "test")));
        count.put("test222", toConfigBlockCountInfo(new BlockCountInfo(4, -1, 2, "test2")));
        config.createSection(SECTION_MAX_COUNT, count);

Код:
private HashMap<String, Object> toConfigBlockCountInfo(BlockCountInfo info){
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("id", info.id);
        map.put("data", info.data);
        map.put("count", info.count);
        map.put("message", info.message);
        return map;
    }


Так вот если удалить "!!ru.travnik.travniksky.BlockCountInfo" из конфига, то броблем с десериализацией никаких нет. Может какие есть настройки для сериализации, чтобы не сериализовало лишнюю информацию
Ну вот и юзай этот кастомный сериализатор и все. Работает же.
Или же перемести этот класс в дефольтный пакет.
 
Ты пытаешься записать в конфиг класс, то есть сам объект, в то время, как тебе нужны свойства объекта, то есть поля класса.Так что создай обычный bean, и записывай поля с помощью созданных геттеров.
 
Назад
Верх