Serialisasi Data Umum
Tanpa metode serialisasi dan deserializng, data anda tidak akan bertahan di restart. Spons memiliki beberapa cara yang berbeda untuk serialize/deserialize data berdasarkan jenis data:
DataSerializables melakukan sebuah antarmuka untuk menjalanan proses serialisasi, dan menggunakan DataBuilder untuk mendeserialisasi dan penciptaan
DataManipulators juga melakukan
DataSerializable
, tetapi malahan menggunakan DataManipulatorBuilder untuk deserialisasi dan penciptaanObjek yang tidak bisa atau tidak dapat melakukan
DataSerializable
menggunakan DataTranslator untuk melakukan serialisasi dan deserialisasi
Ini berarti bahwa hampir semua objek di java dapat disimpan ke disk jika sudah terdaftar!
Membaca DataViews
Kapan pun Anda membaca objek serial, Anda tergoda untuk membaca semua nilai individual Anda agar bisa membuat semua objek yang dibutuhkan secara manual (dan parameternya) untuk data Anda. Namun, tergantung pada data yang tersimpan dalam wadah ada beberapa cara yang jauh lebih mudah:
Jenis-jenis java yang umum seperti
int
,String
,double
,List
danMap
bisa diakses menggunakan metode built-ingetint(DataQuery)
,getString(DataQuery)
, dan lin sebagainya. Daftar dari jenis-jenis tersebut jug bisa didapatkan kembali dengan cara yang sama, sepertigetStringList(DataQuery)
.objek dari
DataSerializable
bisa diakses menggunakangetSerializable(DataQuery),Class
ataugetSerializableList(DataQuery,Class)
. Bersamaan dengan path, anda juga harus menentukanClass
dari jenis yang dapat diserialisasi, sepertiHome.Class
.Objet yang terdaftar dengan
DataTranslator
bisa diakses menggunakangetObject(DataQuery, Class)
ataugetObjectList(DataQuery, Class)
. Daftar semua class-class yang didukung oleh default bisa didapatkan di DataTranslators.
Pada semua kasus anda harus menentukan path menggunakan DataQuery. Jika data anda memiliki kesesuai Key
hal ini semudah memanggil key.getQuery()
. Ataupun, cara yang paling mudah untuk melakukan hal tersebut dengan DataQuery.of(''nama'')
.
Tip
DataQuery bisa digunakan untuk merujuk kepada beberapa pohon node data kebawah, sebagai contoh, DataQuery.of(''my'', ''custom'', ''data'')
.
DataBuilders
Untuk membuat sebuah object menjadi bisa diserialisasi, pertama pastikan bahwa objek menjalankan DataSerializable. Anda hanya harus melakukan dua metode:
getContentVersion()
- ini menentukan versi data anda saat itu.toContainer()
- ini apa yang akan diberikan oleh builder anda saat mencoba untuk mendeserialisasi dan objek. Anda bisa menyimpan apapun yang anda inginkan saat kembali keDataContainer
, selama objek tersebut juga di serialisasi menggunakan salah satu metode diatas. Cukup gunakan metodeset(DataQuery, Object)
untuk menyimpan data anda pada path yang telah diberikan.
Tip
Sangat direkomendasikan bahwa anda menyimpan versi dari data anda di container dan juga gunakan Queries.CONTENT_VERSION
sebagai query. Ini akan mengizinkan peng-upgrade-and versi dengan :ref:`content-updaters'.
Contoh Kode: Melaksanakan toContainer
import org.spongepowered.api.data.DataContainer;
import org.spongepowered.api.data.DataQuery;
import org.spongepowered.api.data.Queries;
import org.spongepowered.api.data.MemoryDataContainer;
String name = "Spongie";
@Override
public DataContainer toContainer() {
return new MemoryDataContainer()
.set(DataQuery.of("Name"), this.name)
.set(Queries.CONTENT_VERSION, getContentVersion());
}
Bagian selanjutnya adalah menjalankan DataBuilder. Direkomendasikan untuk memperpanjang AbstractDataBuilder karena dia akan mencoba meng-upgrade data anda jika versinya lebih rendah dari versi sekarang. Hanya ada satu metode yang perlu anda lakukan- build(DataView)
, atau buildContent(DataView
jika anda menggunakan AbstractDataBuilder
.
Ada baiknya anda memeriksa bahwa semua pertanyaan yang ingin anda ambil tersedia menggunakan DataView.contains(Key...)
. Jika tidak ada kemungkinan data tidak lengkap dan anda harus kembali ke Optional.empty()
.
Jika terlihat semuanya ada disana, gunakan metode getX
untuk menyusun nilai-nila dan kembalikan objek yang baru disusun sebagai Optional
.
Akhirnya, anda perlu mendaftarkan builder ini sehingga bisa ditemukan oleh plugins. Untuk melakukan ini, cukup panggil DataManager#registerDataBuilder(Class, DataBuilder)
dengan rujukan data class dan sebuah contoh dari builder.
DataContentUpdaters
Apa yang terjadi jika anda mengubah tata letak dari data dalam versi terbaru yang dikeluarkan? DataContentUpdaters akan menyelesaikan masalah tersebut. Jika objek yang sudah diserialkan lebih rendah dari versi sekarang, AbstractDataBuilder
akan mencoba dan meng-update data sebelum diserahkan ke builder.
Setiap pembaruan memiliki versi input dan versi output. Anda harus mengambil data lama dan mengubah apapun yang diperlukan untuk memperbarui ke layout yang lebih baru. Jika tidak mungkin berkonversi karna data yang hilang, mungkin saja untuk memberikan nilai default yang di jelaskan di tempat lain - seperti oleh pembangun utama atau objek itu sendiri.
Akhirnya, anda harus memastikan bahwa semua DataContentUpdater
s terdaftar dengan DataManager#registerContentUpdater()
dengan rujukan class data utama - hal ini akan membuat mereka bisa ditemukan oleh builder.
Contoh Kode: Menjalankan DataContentUpdater
org.spongepowered.api.data.persistence.DataContentUpdater
org.spongepowered.api.text.Text
public class NameUpdater implements DataContentUpdater {
@Override
public int getInputVersion() {
return 1;
}
@Override
public int getOutputVersion() {
return 2;
}
@Override
public DataView update(DataView content) {
String name = content.getString(DataQuery.of("Name")).get();
// For example, version 2 uses a text for the name
return content.set(DataQuery.of("Name"), Text.of(name));
}
}
DataManipuatorBuilders
DataManipulatorBuilder
sangat serupa dengan DataBuilder
, namun DataManipualatorBuilder
menambahkan beberapa metode yang berhubungan dengan deserialisasi manipulators:
creat()
akan mengembalikan manipulator baru dengan nilai-nilai defaultCreateFrom(DataHolder)
serupa dengan metode build, tetapi sebaliknya nilai-nilai harus diambil dari DataHolder. Jika disana tidak ada data untuk diambil dari pemegang, cukup kembali ke output daricreate()
. Jika data tidak sesuai denganDataHolder
, anda harus kembali keOptional.empty()
.
Sama seperti DataBuilder
, anda harus membaca dan mengembalikan manipulator anda ke metode build
yang sesuai.
DataManipulatorBuilder
s juga bisa menggunakan DataContentUpdaters, selama anda menjalankan AbstractDataBuilder
.
Mendaftarkan DataManipulatorBuilder
juga sama dengan DataBuilder
tetapi menggunakan metode register()
. Anda harus merujuk kapada kedua class mutable dan immutable anda dalam metode, sebagai tambahan untuk contoh builder anda.
Catatan
Anda harus merujuk pada class pelaksana jika anda sudah membagi API dari pelaksana.
DataTranslators
Sering objek yang ingin anda serialisasi bukan objek yang dijalankan DataSerializable
, seperti Vector3d
atau Tanggal
. Untuk mengizinkan objek tersebut anda menjalankan DataTranslator yang mengurus kedua proses serialisasi dan deserialisasi objek tersebut.
Menjalankan translate
identik dengan toContainer()
dan build(DataView)
untuk DataSerializable
sebagaimana ditunjukkan diatas, kecuali InvalidDataException
dilakukan jika data menghilang di tempat kembalinya Optional
.
Sementara dengan data yang lain, pastikan bahwa anda mendaftar translator dengan DataManager#registerTranslator(Class, DataTranslator)
.