Berry_so
如题。
想写一个具有把物品存储进数据库的功能的插件,想支持文件存储和数据库存储的两种存储方式,但是对于数据库存储物品堆,目前没有太多思路。
请问如何才能把物品堆精确存储入数据库?

本人插件开发小白如果大佬们有相关教程的话,还希望能分享一下

针织薄外套
直接序列化成字符串保存入数据库,取用反序列化即可。
也可以保存为base64减小储存空间占用。https://www.mcbbs.net/forum.php? ... able&tid=859254



穆色
【抛砖引玉】Itemstack类有一个序列化和反序列化的内容,序列化返回的一个map集合,把集合的键值对分别存入数据库即可。

反序列化的时候需要提供一个map集合,这时候就从数据库读取键值对存入一个new的map集合中 然后调用反序列化方法得到itemstack

结冰的离季
本帖最后由 结冰的离季 于 2023-3-30 23:44 编辑

数据库不像 yml 。
yml存String 不支持特殊字符,除了json之外, 想减小体积一般得转base64。又不支持bytes数组的存储(有 ByteList 但是很蛋疼不好用)
数据库支持直接存字节流,
所以利用 BukkitObjectOutputStream 直接把物品转为字节流
再用 GZIPOutputStream 压缩字节流是一个比较节省空间又方便的做法
你可以看看我的实现, 同个文件还有集合 map 的转换方式
https://github.com/Iseason2000/B ... it/ItemUtils.kt#L96
https://github.com/Iseason2000/B ... t/ItemUtils.kt#L774


Berry_so
针织薄外套 发表于 2023-3-30 23:31
直接序列化成字符串保存入数据库,取用反序列化即可。
也可以保存为base64减小储存空间占用。https://www.m ...

谢谢大佬!!我这就去实践一下!!!!

Berry_so
结冰的离季 发表于 2023-3-30 23:41
数据库不像 yml 。
yml存String 不支持特殊字符,除了json之外, 想减小体积一般得转base64。又不支持bytes ...

好的,我尝试一下

Berry_so
穆色 发表于 2023-3-30 23:33
【抛砖引玉】Itemstack类有一个序列化和反序列化的内容,序列化返回的一个map集合,把集合的键值对分别存入 ...

收到!!这个思路好棒,我尝试以下!

青蛙的名单
直接nms存对象是我喜欢的方法

teddyxlandlee
不太懂Bukkit系的数据库和序列化、反序列化,但是据我所知,一个ItemStack无非就三部分:Item(Material)即物品类型、Count即物品数量、NBT。
Item和Count不必多说
NBT由于与JSON、YAML格式均有或多或少的差异,故如果能用SNBT序列化将NBT部分转换为字符串(最直观),或者用NBT的二进制序列化并使用base64转换为字符串(序列化、反序列化效率最高),固然是最好的。然而我不知道Bukkit API有没有相关的接口

美味的曲奇
https://www.spigotmc.org/threads ... le-entities.269621/
通过NBT正反序列化物品就好