Перейти к основному содержимому

Сериализация в NBT

Подготовка класса

Итак, прежде всего создайте класс, который в последствии можно будет сериализовать в NBT.

Пример
@Serializable
class User(
val name: String,
val age: Int,
val address: String,
val friends: List<String>
)

Сериализовать простой класс

Теперь мы можем запросто преобразовать этот класс в NBT:

import ru.hollowhorizon.hc.client.utils.nbt.NBTFormat
import ru.hollowhorizon.hc.client.utils.nbt.serialize

val user = User("Виталик", 21, "Млечный Путь, Земля", arrayOf("Халва", "Алгоритм", "Бармакс"))

val nbt = NBTFormat.serialize(user) // В результате вы получите объект класса net.minecraft.nbt.Tag

/* Выглядеть оно будет примерно так:
{
address: "Млечный Путь, Земля",
age: 21,
friends: [
"Халва",
"Алгоритм",
"Бармакс"
]
}
*/

Десериализовать простой класс

Предположим у нас есть некоторый NBT тэг, преобразуем его обратно в объект класса User:

import ru.hollowhorizon.hc.client.utils.nbt.NBTFormat
import ru.hollowhorizon.hc.client.utils.nbt.deserialize

val tag: Tag //Это наша переменная с NBT, получить её вы можете откуда хотите

val user = NBTFormat.deserialize(tag) // В результате вы получите объект класса User

Сериализация с наследованием

Иногда может потребоваться сериализовать класс или интерфейс, у которого могут быть потомки. В этом случае вам нужно добавить для каждого потомка аннотацию @Polymorphic(Parent::class), где Parent - ваш исходный класс от которого происходит наследование. Не забудьте её импортировать: import ru.hollowhorizon.hc.api.utils.Polymorphic.

В качестве примера можете посмотреть как в HollowCore реализованы виджеты.