序列化数据

警告

这些文档是为 SpongeAPI 7 编写的,可能已经过时。 如果你觉得你可以帮助更新它们,请提交一个 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.

在通过初步地从特定的 DataManipulator 转换为较为普遍的结构之后, DataContainer 还可以起进行进一步的转换。

DataContainer 和 DataView

作为一个可以表示任何数据的通用结构, DataView 支持多个值,甚至包括嵌套的 DataView 作为值,这使得其看起来像一个树形的结构。每一个索引都使用 DataQuery 去表示。 DataContainerDataView 的根。

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.

比如说,我们可以通过使用 DataFormats#JSON 这一 DataFormat ,把一个 DataContainer 转换成 JSON 的形式。输出的 JSON便可以方便地存储在数据库等地方。我们还可以使用相同的 DataFormat 把产生的 JSON 转换回原来的 DataContainer

代码示例所引用的类

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;

代码示例:把一个 ItemStackSnapshot 序列化为 JSON 格式

String json = DataFormats.JSON.write(itemStack.toContainer());

代码示例:反序列化一个 JSON 格式的文本以得到一个 ItemStackSnapshot

DataContainer container = DataFormats.JSON.read(json);

代码示例:把一个 ItemStackSnapshot 序列化为 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();
    }
}

代码示例:反序列化一个 NBT 格式的文件以得到一个 ItemStackSnapshot

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