Помогите Проблемы с преобразованием String[] в примитивный тип

Energy warrior

Активный участник
Пользователь
Баллы
76
Я хочу с помощью PersistentDataContainer'а хранить масив строк в предмете. Готового типа для масива нет. Я решил сделать свой. Написал всё как в PrimitivePersistentDataType только вместо дженериков юзал String[]. Когда я пытаюсь засунуть массив в предмет. У меня вылетает IllegalArgumentException с жалобой на то, что не может найти валидную имплементацию TagAdapter для запрашиваемого String[].
 
Ты ее сам должен создать. Оно же не из воздуха сериализует.
 
Последнее редактирование:
Его тебе и надо реализовать.
Так я его и реализовал!
Код:
public class StringArrayType implements PersistentDataType<String[], String[]>{

    private final Class<String[]> primitiveType;

    public StringArrayType() {
        this.primitiveType = String[].class;
    }

    
    public Class<String[]> getPrimitiveType() {
        return this.primitiveType;
    }

    
    public Class<String[]> getComplexType() {
        return this.primitiveType;
    }

    
    public String[] toPrimitive( String[] complex,  PersistentDataAdapterContext context) {
        return complex;
    }

    
    public String[] fromPrimitive( String[] primitive,  PersistentDataAdapterContext context) {
        return primitive;
    }


Я зашёл в сурцы CraftPersistentDataTypeRegistry и заметил странный класс TagAdapter у которого я не могу посмотреть сурцы. Класс, судя по импорту, вложенный. Но в файле его нет. Я нашёл как создать то что мне нужно но я не знаю в какой момент времени вызываются эти классы, да и правильно ли я сделал.
 
Последнее редактирование:
Так я его и реализовал!
Код:
public class StringArrayType implements PersistentDataType<String[], String[]>{

    private final Class<String[]> primitiveType;

    public StringArrayType() {
        this.primitiveType = String[].class;
    }

   
    public Class<String[]> getPrimitiveType() {
        return this.primitiveType;
    }

   
    public Class<String[]> getComplexType() {
        return this.primitiveType;
    }

   
    public String[] toPrimitive( String[] complex,  PersistentDataAdapterContext context) {
        return complex;
    }

   
    public String[] fromPrimitive( String[] primitive,  PersistentDataAdapterContext context) {
        return primitive;
    }


Я зашёл в сурцы CraftPersistentDataTypeRegistry и заметил странный класс TagAdapter у которого я не могу посмотреть сурцы. Класс, судя по импорту, вложенный. Но в файле его нет. Я нашёл как создать то что мне нужно но я не знаю в какой момент времени вызываются эти классы, да и правильно ли я сделал.
Ну ты глупыш шо ль, те нужно конвертировать из какого-то примитивного типа в массив строк, а не из массива строк в массив строк пздц.
 
Ну ты глупыш шо ль, те нужно конвертировать из какого-то примитивного типа в массив строк, а не из массива строк в массив строк пздц.
Мне в нбт надо хранить масив, и доставать тоже масив!
 
Так я его и реализовал!
Код:
public class StringArrayType implements PersistentDataType<String[], String[]>{

    private final Class<String[]> primitiveType;

    public StringArrayType() {
        this.primitiveType = String[].class;
    }

   
    public Class<String[]> getPrimitiveType() {
        return this.primitiveType;
    }

   
    public Class<String[]> getComplexType() {
        return this.primitiveType;
    }

   
    public String[] toPrimitive( String[] complex,  PersistentDataAdapterContext context) {
        return complex;
    }

   
    public String[] fromPrimitive( String[] primitive,  PersistentDataAdapterContext context) {
        return primitive;
    }


Я зашёл в сурцы CraftPersistentDataTypeRegistry и заметил странный класс TagAdapter у которого я не могу посмотреть сурцы. Класс, судя по импорту, вложенный. Но в файле его нет. Я нашёл как создать то что мне нужно но я не знаю в какой момент времени вызываются эти классы, да и правильно ли я сделал.
В nbt нету сериализатора на String[]
 
Тебе нужно сконвертить в примитив (int, long, double, float, byte, short), примитив массив или строку.
 
Код:
public class ItemTagTypeArray implements PersistentDataType<byte[], String[]> {

    @Override
    public Class<byte[]> getPrimitiveType() {
        return byte[].class;
    }

    @Override
    public Class<String[]> getComplexType() {
        return String[].class;
    }

    @Override
    public byte[] toPrimitive(String[] strings, PersistentDataAdapterContext tag) {
        ByteBuf buf = Unpooled.buffer();
        PacketBuffer pbuf = new PacketBuffer(buf);
        pbuf.writeVarInt(strings.length);
        for (String string : strings) {
            pbuf.writeString(string);
        }
        byte[] bytes = new byte[buf.readableBytes()];
        buf.readBytes(bytes);
        return bytes;
    }

    @Override
    public String[] fromPrimitive(byte[] bytes, PersistentDataAdapterContext tag) {
        ByteBuf buf = Unpooled.buffer();
        PacketBuffer pbuf = new PacketBuffer(buf);
        pbuf.writeBytes(bytes);
        int length = pbuf.readVarInt();
        List<String> tmp = new ArrayList<String>();
        for (int i = 0; i < length; i++) {
            tmp.add(pbuf.readString(256));
        }
        return tmp.toArray(new String[] {});
    }
}
 
Код:
public class ItemTagTypeArray implements PersistentDataType<byte[], String[]> {

    @Override
    public Class<byte[]> getPrimitiveType() {
        return byte[].class;
    }

    @Override
    public Class<String[]> getComplexType() {
        return String[].class;
    }

    @Override
    public byte[] toPrimitive(String[] strings, PersistentDataAdapterContext tag) {
        ByteBuf buf = Unpooled.buffer();
        PacketBuffer pbuf = new PacketBuffer(buf);
        pbuf.writeVarInt(strings.length);
        for (String string : strings) {
            pbuf.writeString(string);
        }
        byte[] bytes = new byte[buf.readableBytes()];
        buf.readBytes(bytes);
        return bytes;
    }

    @Override
    public String[] fromPrimitive(byte[] bytes, PersistentDataAdapterContext tag) {
        ByteBuf buf = Unpooled.buffer();
        PacketBuffer pbuf = new PacketBuffer(buf);
        pbuf.writeBytes(bytes);
        int length = pbuf.readVarInt();
        List<String> tmp = new ArrayList<String>();
        for (int i = 0; i < length; i++) {
            tmp.add(pbuf.readString(256));
        }
        return tmp.toArray(new String[] {});
    }
}
PacketBuffer'а нет!
 
Назад
Верх