Changes

1,885 bytes added ,  17:56, 4 January 2021
Expand and rewrite; emphasize relationship between dynamicops and codecs
Line 1: Line 1: −
<code>DynamicOps</code> is a helper interface that's used to convert files into data types and vice versa. Their usages will probably never be explored by most modders. They are overshadowed by [[codecs]].
+
The <code>DynamicOps</code> class is part of mojang's DataFixerUpper serialization library; DynamicOps are used alongside [[codecs]] to convert java objects to a serialized format and back. While Codecs describe how a java object is to be serialized, DynamicOps describe the format the object is to be serialized to.
   −
== <code>NBTDynamicOps</code> ==
+
The DataFixerUpper library includes several DynamicOps for serializing to json; vanilla minecraft also includes a DynamicOps for serializing to minecraft's [[Using_NBT|NBT]] format.
   −
<code>NBTDynamicOps</code> is a handler that converts an NBT file to an <code>INBT</code> tag. They are also used to parse information from codecs to send them across networks.
+
= Builtin DynamicOps =
   −
There is only one public instance of <code>NBTDynamicOps</code>: <code>INSTANCE</code>.
+
== JsonOps ==
   −
== <code>JsonOps</code> ==
+
The <code>JsonOps</code> DynamicOps are used to serialize and deserialize json data. These are instances of <code>DynamicOps<JsonElement></code>, meaning that they are used to convert java objects to and from <code>JsonElement</code> instances. These can used in conjunction with codecs to serialize/deserialize objects from assets and datapacks.
   −
<code>JsonOps</code> are similar in which they convert a JSON file into a <code>JsonElement</code>. These are usually used in conjunction with codecs as well to serialize/deserialize instances.
+
There are two public instances of JsonOps: <code>JsonOps.INSTANCE</code> and <code>JsonOps.COMPRESSED</code>. Compressed data is represented as a single string to read/write. However, this is never used within vanilla itself.
   −
There are two public instances of <code>JsonOps</code>: <code>INSTANCE</code> and <code>COMPRESSED</code>. Compressed data is represented as a single string to read/write. However, this is never used within vanilla itself.
+
== NBTDynamicOps ==
 +
 
 +
The <code>NBTDynamicOps.INSTANCE</code> is an instance of <code>DynamicOps<INBT></code>, meaning it is used to convert java objects to and from <code>INBT</code> instances. This can be used for serializing data into packets to send across networks, as well as serializing persistant data for entities and similar objects.
 +
 
 +
There is only one public instance of NBTDynamicOps: <code>NBTDynamicOps.INSTANCE</code>.
 +
 
 +
= Using DynamicOps =
 +
 
 +
== Serializing and Deserializing ==
 +
 
 +
By combining a <code>Codec<SomeJavaType></code> with a <code>DynamicOps<SomeSerializedFormat></code>, the proper java object can be converted to the serialized form and back. See [[codecs]] for details on this subject.
 +
 
 +
== Format Conversion ==
 +
 
 +
By using the <code>DynamicOps#convertTo</code> instance method with a second DynamicOps instance, data can be converted between two different serialized formats, such as JsonElement to INBT and back.
 +
 
 +
<syntaxhighlight lang=java>
 +
// converting INBT to JsonElement
 +
JsonElement someJsonElement = NBTDynamicOps.INSTANCE.convertTo(JsonOps.INSTANCE, someNBT);
 +
 
 +
// converting JsonElement to INBT
 +
INBT someNBT = JsonOps.INSTANCE.convertTo(NBTDynamicOps.INSTANCE, someJsonElement);
 +
</syntaxhighlight>
 +
 
 +
Depending on the implementation of the DynamicOps used, this may throw an exception or return an empty object if the two formats are incompatible.
 +
 
 +
In particular, it is *not* safe to convert lists of numbers to NBT in this manner, due to the NBT format's strong typing and the way the NBTDynamicOps attempts to create lists of numbers.
 +
 
 +
= External Links =
 +
* [https://kvverti.github.io/Documented-DataFixerUpper/snapshot/com/mojang/serialization/DynamicOps.html DynamicOps unofficial javadocs]
22

edits