序列化数据
警告
这些文档是为 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 去表示。 DataContainer
是 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.
比如说,我们可以通过使用 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();
}