Serialización de Datos
Advertencia
These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!
While an DataManipulator#Immutable is a good way to store data while the server is running, it will not persist over a restart. However, every DataManipulator implements the DataSerializable interface and thus can be serialized to a DataContainer and deserialized by a DataBuilder.
Después de esta conversación inicial del DataManipulator
especializado para una estructura más general, el DataContainer
se puede seguir procesando.
DataContainer y DataView
Un DataView es una estructura de propósito general para almacenar cualquier tipo de datos. Soporta múltiples valores e incluso anida DataView
s como un valor, así permite una estructura de árbol. Cada valor es identificado por un DataQuery. Un DataContainer
es una raíz DataView
.
DataFormat
DataFormat allows you to store a DataContainer
in HOCON, JSON or NBT format.
You can also recreate DataContainers using DataFormats
. Sponge provided DataFormat
implementations are available in the DataFormats class.
Por ejemplo, podemos utilizar el DataFormats#JSON DataFormat
que nos permite crear una representación de JSON de un DataContainer
. La salida JSON puede entonces fácilmente ser almacenada en un base de datos. Podemos luego usar el mismo DataFormat
para recrear el DataContainer
original de este JSON cuando es requerido.
Importaciones para ejemplos de código
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.DataContainer;
import org.spongepowered.api.data.persistence.DataFormats;
import org.spongepowered.api.item.inventory.ItemStackSnapshot;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Optional;
Ejemplo de Código: Serializar un ItemStackSnapshot para formato JSON
String json = DataFormats.JSON.write(itemStack.toContainer());
Ejemplo de Código: Deserializar un ItemStackSnapshot del formato JSON
DataContainer container = DataFormats.JSON.read(json);
Ejemplo de Código: Escribir un ItemStackSnapshot para un archivo utilizando NBT
public void writeItemStackSnapshotToFile(ItemStackSnapshot itemStackSnapshot, Path path) {
DataContainer dataContainer = itemStackSnapshot.toContainer();
try (OutputStream outputStream = Files.newOutputStream(path)) {
DataFormats.NBT.writeTo(outputStream, dataContainer);
} catch (IOException e) {
// For the purposes of this example, we just print the error to the console. However,
// as this exception indicates the file didn't save, you should handle this in a way
// more suitable for your plugin.
e.printStackTrace();
}
}
Ejemplo de Código: Leer un ItemStackSnapshot desde un archivo utilizando NBT
public Optional<ItemStackSnapshot> readItemStackSnapshotFromFile(Path path) {
try (InputStream inputStream = Files.newInputStream(path)) {
DataContainer dataContainer = DataFormats.NBT.readFrom(inputStream);
return Sponge.getDataManager().deserialize(ItemStackSnapshot.class, dataContainer);
} catch (IOException e) {
e.printStackTrace();
}
return Optional.empty();
}