Freeze_Dolphin
本帖最后由 Freeze_Dolphin 于 2021-7-15 18:00 编辑

RT,写插件需要用到

一开始打算直接保存ItemStack对象为二进制文件,
直接报NoSerializableException

然后用ItemStack#serialize方法序列化了在保存
结果和我说物品堆元属性不能被序列化!md!
  1. java.io.NotSerializableException: org.bukkit.craftbukkit.v1_16_R3.inventory.CraftMetaSkull
  2.         at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185) ~[?:?]
  3.         at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:349) ~[?:?]
  4.         at java.util.LinkedHashMap.internalWriteEntries(LinkedHashMap.java:333) ~[?:?]
  5.         at java.util.HashMap.writeObject(HashMap.java:1411) ~[?:?]
  6.         at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
  7.         at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
  8.         at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
  9.         at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
  10.         at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1145) ~[?:?]
  11.         at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1497) ~[?:?]
  12.         at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433) ~[?:?]
  13.         at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179) ~[?:?]
  14.         at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1379) ~[?:?]
  15.         at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1175) ~[?:?]
  16.         at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1553) ~[?:?]
  17.         at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510) ~[?:?]
  18.         at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433) ~[?:?]
  19.         at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179) ~[?:?]
  20.         at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:349) ~[?:?]
  21.         at io.freeze_dolphin.plain_tinker.utils.SLUtl$.save(SLUtl.scala:10) ~[?:?]
  22.         at io.freeze_dolphin.plain_tinker.commands.threads.CreationThread.io$freeze_dolphin$plain_tinker$commands$threads$CreationThread$generateRecipe(CreationThread.scala:151) ~[?:?]
  23.         at io.freeze_dolphin.plain_tinker.commands.threads.CreationThread$anon$2.onClick(CreationThread.scala:132) ~[?:?]
  24.         at redempt.redlib.inventorygui.InventoryGUI.onClick(InventoryGUI.java:421) ~[?:?]
  25.         at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor75.execute(Unknown Source) ~[?:?]
  26.         at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.16.5.jar:git-Paper-778]
  27.         at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.16.5.jar:git-Paper-778]
  28.         at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.16.5.jar:git-Paper-778]
  29.         at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:624) ~[patched_1.16.5.jar:git-Paper-778]
  30.         at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:2715) ~[patched_1.16.5.jar:git-Paper-778]
  31.         at net.minecraft.server.v1_16_R3.PacketPlayInWindowClick.a(SourceFile:32) ~[patched_1.16.5.jar:git-Paper-778]
  32.         at net.minecraft.server.v1_16_R3.PacketPlayInWindowClick.a(SourceFile:10) ~[patched_1.16.5.jar:git-Paper-778]
  33.         at net.minecraft.server.v1_16_R3.PlayerConnectionUtils.lambda$ensureMainThread$1(PlayerConnectionUtils.java:35) ~[patched_1.16.5.jar:git-Paper-778]
  34.         at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[patched_1.16.5.jar:git-Paper-778]
  35.         at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.16.5.jar:git-Paper-778]
  36.         at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.16.5.jar:git-Paper-778]
  37.         at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.16.5.jar:git-Paper-778]
  38.         at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1266) ~[patched_1.16.5.jar:git-Paper-778]
  39.         at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1259) ~[patched_1.16.5.jar:git-Paper-778]
  40.         at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119) ~[patched_1.16.5.jar:git-Paper-778]
  41.         at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:1220) ~[patched_1.16.5.jar:git-Paper-778]
  42.         at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1134) ~[patched_1.16.5.jar:git-Paper-778]
  43.         at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291) ~[patched_1.16.5.jar:git-Paper-778]
  44.         at java.lang.Thread.run(Thread.java:834) [?:?]
复制代码



南柯郡守
https://www.mcbbs.net/forum.php? ... 00&pid=14634145

protocollib有轮子

Clemens_Mine
本帖最后由 Clemens_Mine 于 2021-7-16 19:08 编辑

用 BukkitObjectOutputStream 序列化
用 BukkitObjectInputStream 反序列化
序列化代码
  1. public static String itemStackArrayToBase64(ItemStack[] items) throws IllegalStateException {
  2.     try {
  3.         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  4.         BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);
  5.       
  6.         dataOutput.writeInt(items.length);
  7.         
  8.         for (int i = 0; i < items.length; i++) {
  9.             dataOutput.writeObject(items[i]);
  10.         }
  11.         
  12.         dataOutput.close();
  13.         return Base64Coder.encodeLines(outputStream.toByteArray());
  14.     } catch (Exception e) {
  15.         throw new IllegalStateException("无法序列化物品.", e);
  16.     }
  17. }
复制代码


反序列化代码
  1.     public static ItemStack[] itemStackArrayFromBase64(String data) throws IOException {
  2.             try {
  3.             ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
  4.             BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
  5.             ItemStack[] items = new ItemStack[dataInput.readInt()];
  6.    
  7.             for (int i = 0; i < items.length; i++) {
  8.                     items[i] = (ItemStack) dataInput.readObject();
  9.             }
  10.             
  11.             dataInput.close();
  12.             return items;
  13.         } catch (ClassNotFoundException e) {
  14.             throw new IOException("无法反序列化物品.", e);
  15.         }
  16. }
复制代码

byxiaobai
Clemens_Mine 发表于 2021-7-16 19:05
用 BukkitObjectOutputStream 序列化
用 BukkitObjectInputStream 反序列化
序列化代码

这新人勋章是咋做到的。。