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 DataViews 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();
}