Özel Veriler Serileştiriliyor
Bir seri hale getirme ve yavaşlatma yöntemi olmadan, verileriniz yeniden başlatıldığında devam etmez. Sponge’ nin, verilerin türüne göre veriyi seri hale getirmek / yavaşlatmak için birkaç farklı yolu vardır :
DataSerializables, seri hale getirme işlemini gerçekleştirmek için bir arabirim uygular ve :javadoc: serbest bırakma ve yaratma için ‘DataBuilder’
DataManipulators da `` DataSerializable`` da uyguluyor, bunun yerineyavaşlatma ve oluşturma için bir :javadoc: DataManipulatorBuilder kullanıyoruz
‘’DataSerializable’’ ın uygulanmasında kullanılamayan objeler use:javadoc: ‘Data Translator’ , hem serialization hemde deserialization için kullanılabilir
Bu, Java’da hemen hemen her nesnenin kaydedilmiş olması durumunda diske kaydedilebileceği anlamına gelir!
DataView okunuyor
Sıralı bir nesneyi her okuduğunuzda, verileriniz için gerekli tüm nesneleri (ve parametrelerini) el ile oluşturmak için tüm bireysel değerleri kendiniz okumanız caziptir. Bununla birlikte, konteynerde kaydedilen verilere bağlı olarak, çok daha kullanışlı birkaç yolu vardır:
Int
,String
,double
,List
veMap
gibi yaygın java tipleri,getInt (DataQuery)
,getString (DataQuery)
vb. yerleşik yöntemlerde kullanılabilir. Bu tür listeler aynı şekilde alınabilir, örneğingetStringList (DataQuery)
.‘’DataSerializable’’ nesneleri ‘’getSerializable(DataQuery, Class)’’ veya ‘’getSerializableList(DataQuery, Class)’’ kullanılarak alınabilir. Yol ile birlikte, ‘’Home.class’’ seri hale getirilebilir türdeki “Class” da belirtmeniz gerekir.
Kayıtlı bir ‘’DataTranslator’’ nesneleri, ‘’getObject(DataQuery, Class)’’ veya ‘’getObjectList(DataQuery, Class)’’ kullanılarak alınabilir. Varsayılan olarak desteklenen sınıfların tam listesi şu adreste bulunabilir :javadoc: ‘DataTranslators’.
Her durumda, bir :javadoc: DataQuery kullanarak bir yol belirtmeniz gerekir. Verilerinizde karşılık gelen bir “Anahtar” varsa, “key.getQuery()” yi çağırmak kadar kolaydır. Aksi takdirde bunu yapmanın en kolay yolu ``DataQuery.of (“name”) ` `lardır.
DataBuilders
Nesneyi seri hale getirilebilir yapmak için öncelikle onun uyguladığından emin olun :javadoc: DataSerializable. Yalnızca iki yöntem uygulamanız gerekir:
‘’get ContentVersion()’’ - Verilerinizin geçerli sürümünü tanımlayar.
‘’toContainer()’’ - serisini kaldırılmaya ve nesne çalışırken üreticinize verilecek olan şey budur. Yukarıdaki yöntemlerden birini kullanarak seri hale getirilebilir olduğu sürece, döndürülen ‘’DataContainer’’ da istediğiniz her şeyi saklayabilirsiniz. Verilerinizi belirtilen yola kaydetmek için ‘’set(DataQuery, Object)’’ yöntemini kullanın.
Tüyo
Sorgunuza “Queries.CONTENT_VERSION” parametresini kullanarak verilerinizin sürümünü de kaydetmeniz önerilir. Bu, güncelleme sürümlerini, :ref: content-updaters ile sağlanacaktır.
Kod Örneği: toContainer Uygulama
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());
}
Sonraki bölüm bir :javadoc:’DataBuilder’ uygulamaktır. :Javadoc:’AbstractDataBuilder’ uzatılması önerilir; çünkü sürüm mevcut sürümden düşükse verilerinizi yükseltmeye çalışacaktır. ‘’AbstractDataBuilder’’ kullanıyorsanız, uygulamanız gereken tek yöntem ‘’build (DataView)’’ veya ‘’buildContent(DataView)’’dir.
Almak istediğiniz tüm sorguların ‘’DataView.contains(Key…)’’ kullanılarak bulunup bulunmadığını kontrol edebilirsiniz. Veriler muhtemelen tamamlanmamış olabilir ve ‘’Optional.empty()’’ işlevine geri dönmelisiniz.
Her şey orada gibi gözüküyorsa değerleri oluşturmak ve yeni oluşturulan bir nesneyi ‘’Optional’’ olarak döndürmek için ‘’getX’’ yöntemlerini kullanın.
Sonunda, bu oluşturucuyu eklentiler tarafından bulunabilecek şekilde kaydettirmeniz gerekir. Bunu yapmak için, veri sınıfını ve oluşturucunun bir örneğini referans alarak DataManager#registerDataBuilder(Class, DataBuilder)
‘yi çağırın.
DataContentUpdaters
Yeni bir sürüm sürümündeki verilerin düzenini değiştirirseniz ne olur? :javadoc: DataContentUpdater sorunu çözdü. Seri hale getirilmiş nesne geçerli sürümden daha küçükse, bir AbstractDataBuilder
veri deneyerek oluşturucuya geçirmeden önce güncelleyecektir.
Her güncelleyici, giriş ve çıkış sürümlerine sahiptir. Eski verileri alıp yeni bir düzene yükseltmek için gerekenleri değiştirmelisin. Eksik veri nedeniyle dönüşümü imkansız hale getiriyorsa bunun yerine başka yerde yorumlanmış bir varsayılan değer sağlamak mümkün olabilir - ana inşaatçı veya nesnenin kendisi gibi.
Sonunda, tüm “DataContentUpdater” ana veri sınıfını referans alarak “DataManager#registerContentUpdater()” ile kaydedildiğinden emin olmanız gerekir - bu onların oluşturucu tarafından bulunmasına izin verecektir.
Code Example: Implenting a 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));
}
}
DataManipulatorBuilders
‘’DataManipulatorBuilder’’, “DataBuilder” çok benzer, ancak manipülatörler serisini kaldırılmak için doğrudan ilgili birkaç yöntem ekler:
‘’create()’’, varsayılan değerlerle yeni bir manipülatör döndürmelidir
‘’createFrom(DataHolder)’’ yapı yöntemine benzer, ancak bunun yerine değerler :javadoc: ‘DataHolder’ dan alınmalıdır. Eğer sahibinden alınacak veri yoksa, sadece ‘’create()’’ işlemine döndürmelisin. Veriler ‘’DataHolder’’ ile uyuşmuyorsa, bunun yerine ‘’Optional.empty()’’ döndürmelisiniz.
Tıpkı ‘’DataBuilder’’ gibi, manipülatörü okumalı ve ilgili ‘’build’’ yönteminde döndürmelisiniz.
‘’DataManipulatorBuilder’’ ve ‘’AbstractDataBuilder’’ uyguladığınız sürece, :ref:’content-updaters’ ile yararlanabilirler.
Bir ‘’DataManipulatorBuilder’’ kaydetmekte ‘’DataBuilder’’ benzer, ancak ‘’register()’’ yöntemini kullanır. Oluşturucu örneğine ilaveten, değiştirilebilir ve değiştirilemeyen sınıflara da yöntemde referans vermeniz gerekir.
Not
API’yi uygulamanızdan ayırdıysanız uygulama sınıflarına başvurmanız gerekir.
VeriÇeviriciler
Seri hale getirmek istediğiniz nesneler, çoğu zaman ‘’Vector3d’’ veya ‘’Date’’ gibi ‘’DataSerializable’’e uygulayan nesneler değildir. Bu nesnelere izin vermek için, :javadoc:’DataTranslator’, nesnenin sıralamasını ve deserialization both yönetir.
Uygulandığı gibi ‘’translate’’ bir “DataSerializable” için “toContainer()’’ ve ‘’build(DataView)’’ aynıdır, ancak veri durumunda bir ‘’InvalidDataException’’ atılır ‘’Optional’’ dönmek yerine kaybolur.
Diğer verilerde olduğu gibi çeviriciyi “DataManager#registerTranslator (Class, DataTranslator)” ile kaydettiğinizden emin olun.