Added byte array serialization/deserialization for PersistentDataContainers (#7505)

This commit is contained in:
Nex 2022-09-18 04:06:53 +00:00 committed by GitHub
parent dbda887457
commit 63cb7472ac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 88 additions and 0 deletions

View File

@ -0,0 +1,50 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Nex <nex@bits.team>
Date: Thu, 24 Feb 2022 16:28:08 +0100
Subject: [PATCH] Added byte array serialization/deserialization for
PersistentDataContainers
diff --git a/src/main/java/org/bukkit/persistence/PersistentDataContainer.java b/src/main/java/org/bukkit/persistence/PersistentDataContainer.java
index eebb3da156e2d95efbe22d4afa470b977ce19f10..d30ad7cae1dfbb47ab1a6e3e2fcd6fb76163fe78 100644
--- a/src/main/java/org/bukkit/persistence/PersistentDataContainer.java
+++ b/src/main/java/org/bukkit/persistence/PersistentDataContainer.java
@@ -164,5 +164,38 @@ public interface PersistentDataContainer {
* @throws NullPointerException if the key to look up is null
*/
boolean has(@NotNull NamespacedKey key);
+
+ /**
+ * Serialize this {@link PersistentDataContainer} instance to a
+ * byte array.
+ *
+ * @return a binary represenation of this container
+ * @throws java.io.IOException if we fail to write this container to a byte array
+ */
+ byte @NotNull [] serializeToBytes() throws java.io.IOException;
+
+ /**
+ * Read values from a serialised byte array into this
+ * {@link PersistentDataContainer} instance.
+ *
+ * @param bytes the byte array to read from
+ * @param clear if true, this {@link PersistentDataContainer} instance
+ * will be cleared before reading
+ * @throws java.io.IOException if the byte array has an invalid format
+ */
+ void readFromBytes(byte @NotNull [] bytes, boolean clear) throws java.io.IOException;
+
+ /**
+ * Read values from a serialised byte array into this
+ * {@link PersistentDataContainer} instance.
+ * This method has the same effect as
+ * <code>PersistentDataContainer#readFromBytes(bytes, true)</code>
+ *
+ * @param bytes the byte array to read from
+ * @throws java.io.IOException if the byte array has an invalid format
+ */
+ default void readFromBytes(byte @NotNull [] bytes) throws java.io.IOException {
+ this.readFromBytes(bytes, true);
+ }
// Paper end
}

View File

@ -0,0 +1,38 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Nex <nex@bits.team>
Date: Thu, 24 Feb 2022 16:28:07 +0100
Subject: [PATCH] Added byte array serialization/deserialization for
PersistentDataContainers
diff --git a/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java b/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java
index f0588bec9be09cb8273c310fb3de8bfe72dee9e5..20c7144307ecf1eb5c600f3b84df7bc15fa941d6 100644
--- a/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java
+++ b/src/main/java/org/bukkit/craftbukkit/persistence/CraftPersistentDataContainer.java
@@ -168,5 +168,26 @@ public class CraftPersistentDataContainer implements PersistentDataContainer {
return this.customDataTags.containsKey(key.toString());
}
+
+ @Override
+ public byte[] serializeToBytes() throws java.io.IOException {
+ net.minecraft.nbt.CompoundTag root = this.toTagCompound();
+ java.io.ByteArrayOutputStream byteArrayOutput = new java.io.ByteArrayOutputStream();
+ try (java.io.DataOutputStream dataOutput = new java.io.DataOutputStream(byteArrayOutput)) {
+ net.minecraft.nbt.NbtIo.write(root, dataOutput);
+ return byteArrayOutput.toByteArray();
+ }
+ }
+
+ @Override
+ public void readFromBytes(byte[] bytes, boolean clear) throws java.io.IOException {
+ if (clear) {
+ this.clear();
+ }
+ try (java.io.DataInputStream dataInput = new java.io.DataInputStream(new java.io.ByteArrayInputStream(bytes))) {
+ net.minecraft.nbt.CompoundTag compound = net.minecraft.nbt.NbtIo.read(dataInput);
+ this.putAll(compound);
+ }
+ }
// Paper end
}